博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对stack概念的理解与应用
阅读量:6611 次
发布时间:2019-06-24

本文共 2882 字,大约阅读时间需要 9 分钟。

stack,中文翻译做“栈”,特点就是先进后出,后进先出。

像盖房子一样,新的数据总是被放在上层,若要取数据,就像拆房子,不要太暴力的方式,就要从顶层一层层往下拆。

stack有几种操作,push——进栈,pop——出栈,isempty——检查是否为空栈,top——栈顶元素位置。

1 #include
2 #include
3 #define DataType int 4 #define MAXSIZE 1024 5 typedef struct 6 { 7 DataType data[MAXSIZE]; 8 int top; 9 }SeqStack;10 SeqStack *Init_SeqStack()//栈初始化11 {12 SeqStack *s;13 s=(SeqStack *)malloc(sizeof(SeqStack));//申请空间14 if(!s)15 {16 printf("空间不足\n");17 return NULL;18 }19 else20 {21 s->top=-1;22 return s;23 }24 }25 int Empty_SeqStack(SeqStack *s)//判栈空26 {27 if(s->top==-1) return 1;28 else return 0;29 }30 int Push_SeqStack(SeqStack *s,DataType x)//入栈31 {32 if(s->top==MAXSIZE-1) return 0;//栈满不能入栈33 else34 {35 s->top++;//栈顶+136 s->data[s->top]=x;//将元素放入data数组中37 return 1;38 }39 }40 int Pop_SeqStack(SeqStack *s,DataType *x)//出栈41 {42 if(Empty_SeqStack(s)) return 0;//栈空不能出栈43 else44 {45 *x=s->data[s->top];46 s->top--;//栈顶-147 return 1;48 }//栈顶元素存入*x,返回49 }50 DataType Top_SeqStack(SeqStack *s)//取栈顶元素51 {52 if(Empty_SeqStack(s)) return 0;//栈空53 else return s->data[s->top];54 }55 int Print_SeqStack(SeqStack *s)//打印栈中所有元素56 {57 int i;58 printf("当前栈中的元素:\n");59 for(i=s->top;i>=0;i--) printf("%3d",s->data[i]);60 printf("\n");61 return 0;62 }63 int main()64 {65 SeqStack *L;66 int n,num,m;67 int i;68 L=Init_SeqStack();69 printf("初始化完成\n");70 printf("栈空:%d\n",Empty_SeqStack(L));71 printf("请输入入栈元素个数:\n");72 scanf("%d",&n);73 printf("请输入要入栈的%d个元素:\n",n);74 for(i=0;i
View Code

借助百度百科对于栈的介绍,利用链表的形式建了个栈,可以实现基本的操作,如进栈、出栈、判断空、打印栈中元素、返回栈顶元素。

听学长讲,貌似可以调用#include<vector>库实现对栈的操作。

栈在程序设计时有很多应用,举个最近正在用的例子,算术表达式求值。

例如对于中缀表达式3/5+8,将其改写为后缀表达式形式3 5 / 8 +,这就可以用栈进行计算了。

运算原理就是碰到数字就进栈,碰到运算符就取出栈顶前两个元素和此运算符进行运算,得到的数字再进栈,最后栈里的唯一元素即为值。

如1 2 + 8 2 - 7 4 - / *

步骤 栈中元素 说明
1 1 1进栈
2 12 2进栈
3   遇+号退栈2和1
4 3 1+2=3的结果3进栈
5 38 8进栈
6 382 2进栈
7 3 遇-号退栈2和8
8 36 8-2=6的结果6进栈
9 367 7进栈
10 3674 4进栈
11 36 遇-号退栈4和7
12 36 7-4=3的结果3进栈
13 3 遇/号退栈3和6
14 32 6/3=2的结果2进栈
15   遇*号退栈2和3
16 6 3*2=6进栈
17 6 扫描完毕,运算结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

中缀表达式转后缀表达式算法则为,建一个空栈存放运算符,遇到数字直接输出,并输出一个空格分隔开两个数字,遇到运算符则与栈顶元素比较优先级,大于就进栈,否则推出栈顶元素并输出,并输出一个空格分隔,遇到左括号进栈,遇到右括号则一直退栈输出,直到退到左括号止。当栈变成空时,输出的结果即为后缀表达式。

如(1+2)*((8-2)/(7-4))

步骤 栈中元素 输出结果 说明
1 (   (进栈
2 ( 1 输出1
3 (+ 1 +进栈
4 (+ 1 2 输出2
5   1 2 + +退栈输出,退栈到(止
6 * 1 2 + *进栈
7 *( 1 2 + (进栈
8 *(( 1 2 + (进栈
9 *(( 1 2 + 8 输出8
10 *((- 1 2 + 8 输出2
11 *((- 1 2 + 8 2 - 进栈
12 *( 1 2 + 8 2 - -退栈输出,退栈到(止
13 *(/ 1 2 + 8 2 - / 进栈
14 *(/( 1 2 + 8 2 - ( 进栈
15 *(/( 1 2 + 8 2 - 7 输出7
16 *(/(- 1 2 + 8 2 - 7 -进栈
17 *(/(- 1 2 + 8 2 - 7 4 输出4
18 *(- 1 2 + 8 2 - 7 4 - -退栈输出,退栈到(止
19 * 1 2 + 8 2 - 7 4 - / /退栈输出,退栈到(止
20   1 2 + 8 2 - 7 4 - / * *退栈并输出

转载于:https://www.cnblogs.com/yimingzou/p/3487776.html

你可能感兴趣的文章
父类转为子类涉及到的安全问题
查看>>
网络流,流水线模拟
查看>>
知识点笔记
查看>>
陈云川的OPENLDAP系列
查看>>
django 模型-----自连接
查看>>
P1197 [JSOI2008]星球大战
查看>>
urllib模块
查看>>
XML转义字符
查看>>
微信小程序之简单记账本开发记录(六)
查看>>
死锁和活锁
查看>>
JavaScript的简单继承实现案例
查看>>
第六篇 VIM你值得拥有!
查看>>
高淇java300集JAVA常用类作业
查看>>
<Linux命令行学习 第一节> CentOS在虚拟机的安装
查看>>
mysql设置字符集CHARACTER SET
查看>>
如何在Oracle中复制表结构和表数据
查看>>
[河南省ACM省赛-第四届] 序号互换 (nyoj 303)
查看>>
3 Oracle 32位客户端安装及arcgis连接
查看>>
Perl完全自学手册图文教程
查看>>
springmvc初始化数据
查看>>