目录
一:顺序栈及其基本操作
1.头文件
#include <iostream>
2.定义
//栈的顺序存储类型描述
#define MaxSize 50
typedef struct {
int data [MaxSize];//存放栈中元素
int top;//栈顶指针
}SeqStack;
3.初始化
//初始化
void InitStack(SeqStack &S){
S.top=-1;
}
4.判空
//判空
bool StackEmpty(SeqStack S){
if (S.top==-1){
printf("yes\n");
return true;
} else{
printf("no\n");
return false;
}
}
5.进栈
//进栈
bool Push(SeqStack &S,int e){
if(S.top==MaxSize-1){
return false;//栈满
}
S.data[++S.top]=e;//指针先+1,再调用入栈
return true;
}
6.出栈
//出栈
int Pop(SeqStack &S){
if(S.top==-1){//栈为空
return false;
}
int x=S.data[S.top--];//指针先-1,再调用出栈
return x;
}
7.读取栈顶元素
//读取栈顶元素
int GetTop(SeqStack S){
if(S.top==-1){//栈为空
return false;
}
int x=S.data[S.top];
return x;
}
8.主函数
int main() {
SeqStack S;
InitStack(S);
StackEmpty(S);
Push(S,1);
int i=GetTop(S);
printf("%d\n",i);
Push(S,2);
Push(S,3);
i=GetTop(S);
printf("%d\n",i);
Pop(S);
i=GetTop(S);
printf("%d\n",i);
Pop(S);
Pop(S);
StackEmpty(S);
return 0;
}
运行结果:
yes
1
3
2
yes进程已结束,退出代码为 0
二:链栈及其基本操作
1.头文件
#include <iostream>
2.定义
//定义
typedef struct LinkNode{
int data;
struct LinkNode *next,*top;
}LinkNode,*LinkStack;
3.初始化
//初始化
void InitLinkStack(LinkStack &S){
S=(LinkStack) malloc(sizeof(LinkNode));//分配一个头结点
S->next= NULL;//初始化循环单链表为空
S->top=S;
}
4.出栈
//出栈
bool DeleteLinkStack(LinkStack &S){
if(S->next==NULL){
return false;//栈为空
}
LinkNode *q=S->top;
int x=q->data;
S->top=S->top->next;
S->next=S->top;
free(q);
return true;
}
5.入栈
//入栈
void InLinkStack(LinkStack &S,int e){
LinkNode *s=(LinkStack)malloc(sizeof(LinkNode));
s->data=e;
s->next=S->top->next;
S->top=s;
S->next=s;
}
6.判空
//判空
bool isEmpty(LinkStack S){
if(S->next==NULL){
printf("Empty\n");
return true;
} else{
printf("No empty\n");
return false;
}
}
7.取栈顶元素
//取栈顶元素
bool GetLinkStack(LinkStack S){
if(S->next==NULL){
return false;//栈为空
}
int x=S->top->data;
printf("top data=%d\n",x);
return true;
}
8.主函数
int main() {
LinkStack s;
InitLinkStack(s);
isEmpty(s);
InLinkStack(s,1);
isEmpty(s);
GetLinkStack(s);
InLinkStack(s,2);
GetLinkStack(s);
DeleteLinkStack(s);
GetLinkStack(s);
DeleteLinkStack(s);
isEmpty(s);
return 0;
}
运行结果:
Empty
No empty
top data=1
top data=2
Empty进程已结束,退出代码为 0
三:链栈的应用
1.括号匹配
算法理解:
1.左括号入栈
2.右括号出栈并匹配
3.失败情况:
无左括号余右括号(即栈空但字符串还未扫描完)
无右括号,余左括号(即扫描完,但栈非空)
左右括号不匹配
2.中缀表达式转后缀表达式(逆波兰表达式)—左优先
算法理解:
1.从左往右扫描
2.遇到操作数直接输出
3.遇到下一个运算符与栈中的运算符作比较,如果比栈中高级或栈为空,则直接压入栈中,如果和栈中的平级或比栈中的低级,先将栈中比他低级和平级的依次出栈输出,再将其压入栈中
4.遇到(直接入栈,遇到)直接一直出栈到(,并依次打印除了(以外的运算符
5.全部扫描完依次打印栈中剩余运算符
3.后缀表达式的计算
算法理解:
1.从左往右扫描,遇到操作数入栈
2.遇到运算符op,连续出栈2次,依次赋值给下x1,x2
3.x=x1x2op,并重新压回栈中
4.全部扫描后栈顶结束计算结果
4.中缀表达式转前缀表达式(波兰表达式)——右优先
算法理解:
1.从右往左扫描
2.遇到操作数压入栈2
3.遇到运算符与栈1中的运算符作比较,如果比栈1中高级或栈为空,直接压入栈1中,如果和栈1中的平级或比栈1中的低级,先将栈1中比他低级和平级的依次出栈1并压入栈2 ,再将其压入栈1中
4.遇到)直接入栈,遇到(直接一直出栈到),并依次将除了(以外的运算符压入栈2
5.全部扫描完依次出栈1中剩余运算符,并压入栈2中
6.依次输出栈2中运算符和操作数。