我是靠谱客的博主 直率口红,最近开发中收集的这篇文章主要介绍详解C语言之堆栈,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、何为堆栈?

a.堆栈是一种特殊的线性表

b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(FILO)或“后进先出”(LIFO)的线性表

c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底

d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈

二、思维导图

三、代码

1、顺序堆栈

#include <stdio.h>
typedef int DataType;
#define MaxStackSize 64
typedef struct
{
	DataType stack[MaxStackSize];
	int top;
}SeqStack;
//初始化
void StackInit(SeqStack *S)
{
	S->top = 0;
}
//判断是否栈空
int StackIsEmpty(SeqStack S)
{
	if (S.top <= 0)
		return 0;
	else
		return 1;
}
//入栈
int StackPush(SeqStack *S, DataType x)
{
	if (S->top >= MaxStackSize)
	{
		printf("栈满,无法进栈!!!n");
		return 0;
	}
	else
	{
		S->stack[S->top] = x;
		S->top++;
		return 1;
	}
}
//出栈
int StackPop(SeqStack *S, DataType *x)
{
	if (S->top <= 0)
	{
		printf("堆栈已空,无法出栈!!!n");
		return 0;
	}
	else
	{
		S->top--;
		*x = S->stack[S->top];
		return 1;
	}
}
//获取栈顶元素
int StackGetTop(SeqStack S, DataType *x)
{
	if (S.top <= 0)
	{
		printf("堆栈已空!!!n");
			return 0;
	}
	else
	{
		*x = S.stack[S.top - 1];
		return 1;
	}
}
int main()
{
	SeqStack myStack;
	int i, x;
	StackInit(&myStack);
	for (i = 0; i < 10; i++)
		StackPush(&myStack, i + 1);
	StackGetTop(myStack, &x);
	printf("当前栈顶元素为:%dn", x);
	printf("依次出栈:");
	while (StackIsEmpty(myStack))
	{
		StackPop(&myStack, &x);
		printf("%d ", x);
	}
	system("pause");
	return 0;
}

2、链式堆栈

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
	DataType data;
	struct snode *next;
}LSNode;
//初始化
void StackInit(LSNode **top)
{
	*top = (LSNode *)malloc(sizeof(LSNode));
	(*top)->next = NULL;
}
//判断堆栈是否非空
int StackIsEmpty(LSNode *top)
{
	if (top->next == NULL)
		return 0;
	else
		return 1;
}
//入栈
void StackPush(LSNode *top, DataType x)
{
	LSNode *p;
	p = (LSNode *)malloc(sizeof(LSNode));
	p->data = x;
	p->next = top->next;
	top->next = p;
}
//出栈
int StackPop(LSNode *top, DataType *x)
{
	LSNode *p = top->next;
	if (p == NULL)
	{
		printf("堆栈已空,删除错误!!!n");
		return 0;
	}
	top->next = p->next;
	*x = p->data;
	free(p);
	return 1;
}
//获取栈顶元素
int StackGetTop(LSNode *top, DataType *x)
{
	LSNode *p = top->next;
	if (p == NULL)
	{
		printf("堆栈已空,取出错误!!!n");
		return 0;
	}
	*x = p->data;
	return 1;
}
//释放内存空间
void StackDestroy(LSNode **top)
{
	LSNode *p, *q;
	p = *top;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*top = NULL;
}
int main()
{
	int i, x;
	LSNode *top;
	StackInit(&top);
	for (i = 0; i < 10; i++)
		StackPush(top, i + 1);
	StackGetTop(top, &x);
	printf("当前栈顶元素为%dn", x);
	printf("依次出栈:");
	while (StackIsEmpty(top))
	{
		StackPop(top, &x);
		printf("%4d", x);
	}
	StackDestroy(&top);
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注靠谱客的更多内容!

最后

以上就是直率口红为你收集整理的详解C语言之堆栈的全部内容,希望文章能够帮你解决详解C语言之堆栈所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(93)

评论列表共有 0 条评论

立即
投稿
返回
顶部