数据结构
堆栈
栈
堆栈的抽象数据类型描述
堆栈(Stack):具有一定操作约束的线性表
只在一端(栈顶,Top)做插入、删除
插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:Last In First Out (LIFO)
栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。


c
#define MaxSize <存储数据元素的最大个数>
typedef struct SNode *Stack;
struct SNode {
ElementType Data [MaxSize];
int Top;
};
入栈 Push
javascript
void Push (Stack PtrS, ElementType item)
{
if (PtrS->Top == MaxSize - 1){ //判断栈是否满了
printf("堆栈满");
return;
}else{ //栈没满,先Top指针上移,再填充内容
PtrS->Data[++(PtrS->Top)] = item;
return;
}
};
出栈 Pop
c
ElementType Pop (Stack PtrS)
{
if(Ptrs->Top == -1){ //判断堆栈有没有空
printf("堆栈空");
return ERROR;
}else
return (PtrS->Data[(PtrS->Top)--]); //出栈,先取值,再减一
}
栈的链式存储结构
栈的链式存储结构实际上是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶(Top指针指向链表的head头,不可以指向尾。指向尾的话,我们只能通过遍历进行删除尾结点操作)
栈结点
c
typedef struct SNode *Stack;
struct SNode {
ElementType Data; //结点的实际内容
struct SNode *Next; //结点中的包含下一个结点地址的指针
};
栈创建

c
Stack CreateStack()
{ /*构建一个堆栈的头节点,返回指针S*/
Stack S;
S=(Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
int IsEmpty(Stack S) //判断栈是否为空
{
return (S->Next == NULL);
}
入栈 Push
链栈的入栈,不用判断是否栈满。它会向内存中申请空间,没有固定大小。
c
void Push(ElementType item, Stack S)
{
/* 将元素 item 压入堆栈 S */
struct SNode *TmpCell;
TmpCell = (struct SNode *)malloc(sizeof(struct SNode));
TmpCell->Element = item;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
出栈 Pop
出栈需要判断是否为空。
c
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;
}
}
栈的应用
用于表达式的计算