文章目录
一、栈的定义
栈是一种特殊的线性表(限定性的线性表),是只允许在一端进行插入或删除操作的线性表
二、栈的相关术语
栈顶、栈底、空栈
特点:后进先出
三、栈的基本操作
InitStack(S): 初始化栈
Push(S,x): 插入操作
Pop(S,x): 删除操作,弹出栈顶元素返回该值并删除
GetTop(S,x):查询操作,弹出栈顶元素,不会删除
IsEmpty (S):判空操作
IsFull(S):判满操作
四、栈的存储结构
4.1 顺序存储–顺序栈
4.1.1 顺序栈定义
#define Stack_Size 50 //栈中元素个数
typedef struct{
char elem[Stack_Size]; //静态数组存放栈中元素
int top; //栈顶元素的下标,top=-1 表示空栈
}SeqStack;
4.1.2 顺序栈初始化
//初始化栈
void InitStack(SeqStack *S){
printf("初始化栈\n");
S->top=-1;
}
4.1.3 顺序栈进栈
int Push(SeqStack *S,char x){
//判断是否栈已满
if(IsFull(S)){
printf("栈已满,无法插入!\n");
return 0;
}
S->top++;
S->elem[S->top]=x;
return 1;
}
//判断栈是否已满
int IsFull(SeqStack *S){
if(S->top==Stack_Size-1){
return 1;
}
else return 0;
}
4.1.3 顺序栈出栈
int Pop(SeqStack *S,char *x){
//判断是否栈已空
if(IsEmpty(S)){
printf("栈已空,栈中无元素!\n");
return 0;
}
*x= S->elem[S->top];
S->top--;
return 1;
}
//判断栈是否为空
int IsEmpty(SeqStack *S){
if(S->top==-1){
return 1;
}
else return 0;
}
4.1.4 读取栈顶元素
int GetTop(SeqStack *S,char *x){
//判断是否栈已空
if(IsEmpty(S)){
printf("栈已空,栈中无元素!\n");
return 0;
}
*x= S->elem[S->top];
return 1;
}
4.2 顺序存储–共享栈
两个栈共享同一片空间
4.3 链式存储–链栈
4.3.1 链栈定义(类似单链表)
typedef struct node{
char data;
struct node * next;
}LinkStackNode,*LinkStack;
4.3.2 链栈进栈(类似单链表尾插法)
4.3.3 链栈出栈
五、栈的应用
5.1 括号匹配
5.2 表达式求值
5.3 递归
六、总代码
顺序栈的相关代码 已验证过:
#include<stdio.h>
#include<stdlib.h>
#define Stack_Size 50 //栈中元素个数
typedef struct{
char elem[Stack_Size]; //静态数组存放栈中元素
int top; //栈顶元素的下标,top=-1 表示空栈
}SeqStack;
//初始化栈
void InitStack(SeqStack *S){
printf("初始化栈\n");
S->top=-1;
}
//判断栈是否为空
int IsEmpty(SeqStack *S){
if(S->top==-1){
return 1;
}
else return 0;
}
//判断栈是否已满
int IsFull(SeqStack *S){
if(S->top==Stack_Size-1){
return 1;
}
else return 0;
}
//求栈中元素个数/遍历栈
int Length(SeqStack *S){
return (S->top)+1;
}
int Push(SeqStack *S,char x){
//判断是否栈已满
if(IsFull(S)){
printf("栈已满,无法插入!\n");
return 0;
}
S->top++;
S->elem[S->top]=x;
return 1;
}
int Pop(SeqStack *S,char *x){
//判断是否栈已空
if(IsEmpty(S)){
printf("栈已空,栈中无元素!\n");
return 0;
}
*x= S->elem[S->top];
S->top--;
return 1;
}
int GetTop(SeqStack *S,char *x){
//判断是否栈已空
if(IsEmpty(S)){
printf("栈已空,栈中无元素!\n");
return 0;
}
*x= S->elem[S->top];
return 1;
}
int main(){
SeqStack stack;
InitStack(&stack);
printf("===========进栈操作==========\n");
Push(&stack,'a');
Push(&stack,'b');
Push(&stack,'c');
Push(&stack,'d');
Push(&stack,'e');
printf("===========此时栈中元素个数为===========\n");
printf("个数为:%d\n",Length(&stack));
printf("===========出栈操作==========\n");
char data;
Pop(&stack,&data);
printf("弹出的元素为:%c\n",data);
printf("===========此时栈中元素个数为===========\n");
printf("个数为:%d\n",Length(&stack));
printf("===========取栈顶元素==========\n");
GetTop(&stack,&data);
printf("取出的元素为:%c\n",data);
printf("===========此时栈中元素个数为===========\n");
printf("个数为:%d\n",Length(&stack));
}