什么是堆栈
- 像叠盘子一样,先放下的在下面,先拿出来的却是最上面的,也就是,先进去的最后才出来
- 先进后出的就是堆栈
堆栈的操作
- 生成空堆栈,其最大长度为MaxSize
- 判断堆栈S是否已满
- 将元素item压入堆栈
- 判断堆栈S是否为空
- 删除并返回栈顶元素
堆栈的链式存储实现
链表结构体初始化
typedef struct SNode *Stack;
struct SNode
{
ElementType Data;
struct SNode *Next;
}
堆栈初始化
Stack createStack()
{
//构建一个堆栈的头结点,返回指针
Stack S;
S = (Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
判断堆栈S是否为空
int IsEmpty(Stack S)
{
//判断堆栈s是否为空,若为空函数返回整数1,否则返回整数0
return (S->Next == NULL);
}
将元素item压入堆栈
void Push(ElementType item, Stack S)
{
//将元素item压入堆栈S
struct SNode* TmpCell;
//感觉 (struct SNode*) ,这里是不是可以换成 (Stack) ?找个机会试试
TmpCell = (struct SNode *)malloc(sizeof(struct SNode));
TmpCell->Element = item;
TmpCell->Next = S->Next;
//使得 TmpCell 为头结点,并且 S 仍旧指向头结点
//这样做的好处是
//在出栈的时候,直接调用 S 就行了。S 必然是最后保存的元素
S->Next = TmpCell;
}
删除并返回栈顶元素
ElementType Pop(Stack S)
{
//删除并返回堆栈S的栈顶元素
struct SNode* FirstCell;
//定义同栈顶元素类型的一个变量,用于存储栈顶元素
ElementType TopElem;
//判断是否为空栈
if (ISEmpty(S))
{
printf("堆栈为空");
return NULL;
}
else
{
//释放空间前的预备操作,将 次结点 作为 头结点
FirstCell = S->Next;
S->Next = FirstCell->Next;
//存储栈顶元素,不然释放空间后就找不到元素了
TopElem = FirstCell->Element;
free(FirstCell);
//返回栈顶元素(其实也就是出栈啦,顺带删除掉而已)
return TopElem;
}
}
标签:struct,元素,SNode,Next,堆栈,Stack,线性表
From: https://www.cnblogs.com/aduiduidui/p/17020914.html