一、栈的定义
栈是一种特殊的线性表,允许在同一端进行插入和删除操作,遵循“先进后出”的原则。
栈的基本操作:入栈(Push)、出栈(Pop)。
二、栈的分类
栈可以分为:顺序栈和链栈。
(1)顺序栈
顺序栈是栈的顺序存储结构的简称,它是一个运算受限的顺序表。
使用C语言定义顺序栈类型的格式。
#define StackSize 100 //预分配的栈空间最多为100个元素 typedef char DataType; //栈元素的数据类型为字符 typedef struct { DataType data[StackSize]; int top; }SeqStack;
初始化栈,将栈置空
void InitStack(SeqStack *S) { //将顺序栈置空 S->top = -1; }
判断栈是否为空
int StackEmpty(SeqStack *S) { return S->top == -1; }
判断栈是否为满
void StackFull(SeqStack *S) { return S->top == StackSize - 1; }
压栈
void Push(S, x) { if (StackFull(S)) { Error("Stack overflow");//上溢,退出运行 } S->data[++S->top] = x;//栈顶指针加1后将x入栈 }
出栈
DataType Pop(S) { if (StackEmpty(S)) { Error("Stack underflow");//下溢,退出运行 } return S->data[S->top--];//栈顶元素返回后将指针减1 }
取栈顶元素
DataType StackTop(S) { if (StackEmpty(S)) { Error("Stack is empty!"); } return S->data[S->top]; }
(2)链栈
C语言定义链栈类型的代码如下:
typedef struct stacknode { DataType data; struct stacknode *next; }StackNode; typedef struct { StackNode *top; //栈顶指针 }LinkStack;
将栈置空
void InitStack(LinkStack *S) { S->top = NULL; }
判断栈是否为空
int StackEmpty(LinkStack *S) { return S->top == NULL; }
进栈
void Push(LinkStack *S, DataType x) { //将元素x插入栈链头部 StackNode *p = (StackNode *)malloc(sizeof(StackNode)); p->data = x; p->next = S->top;//将新节点*p插入链栈头部 S->top = p; }
退栈
DataType Pop(LinkStack *S) { DataType x; StackNode *p = S->top; //保存栈顶指针 if (StackEmpty(S)) { Error("Stack underflow.");//下溢 } x = p->data; //保存栈顶节点数据 S->top = p->next; //将栈顶节点从链上摘下 free(p); return x; }
获取栈顶元素
DataType StackTop(LinkStack *S) { if (StackEmpty(S)) { Error("Stack is empty!"); } return S->top->data; }