对stack概念的理解与应用
stack,中文翻译做“栈”,特点就是先进后出,后进先出。
像盖房子一样,新的数据总是被放在上层,若要取数据,就像拆房子,不要太暴力的方式,就要从顶层一层层往下拆。
stack有几种操作,push——进栈,pop——出栈,isempty——检查是否为空栈,top——栈顶元素位置。
#include<stdio.h>
#include<malloc.h>
#define DataType int
#define MAXSIZE 1024
typedef struct
{
DataType data[MAXSIZE];
int top;
}SeqStack;
SeqStack *Init_SeqStack()//栈初始化
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));//申请空间
if(!s)
{
printf("空间不足\n");
return NULL;
}
else
{
s->top=-;
return s;
}
}
int Empty_SeqStack(SeqStack *s)//判栈空
{
if(s->top==-) return ;
else return ;
}
int Push_SeqStack(SeqStack *s,DataType x)//入栈
{
if(s->top==MAXSIZE-) return ;//栈满不能入栈
else
{
s->top++;//栈顶+1
s->data[s->top]=x;//将元素放入data数组中
return ;
}
}
int Pop_SeqStack(SeqStack *s,DataType *x)//出栈
{
if(Empty_SeqStack(s)) return ;//栈空不能出栈
else
{
*x=s->data[s->top];
s->top--;//栈顶-1
return ;
}//栈顶元素存入*x,返回
}
DataType Top_SeqStack(SeqStack *s)//取栈顶元素
{
if(Empty_SeqStack(s)) return ;//栈空
else return s->data[s->top];
}
int Print_SeqStack(SeqStack *s)//打印栈中所有元素
{
int i;
printf("当前栈中的元素:\n");
for(i=s->top;i>=;i--) printf("%3d",s->data[i]);
printf("\n");
return ;
}
int main()
{
SeqStack *L;
int n,num,m;
int i;
L=Init_SeqStack();
printf("初始化完成\n");
printf("栈空:%d\n",Empty_SeqStack(L));
printf("请输入入栈元素个数:\n");
scanf("%d",&n);
printf("请输入要入栈的%d个元素:\n",n);
for(i=;i<n;i++)
{
scanf("%d",&num);
Push_SeqStack(L,num);
}
Print_SeqStack(L);
printf("栈顶元素:%d\n",Top_SeqStack(L));
printf("请输入要出栈的元素个数(不能超过%d个):\n",n);
scanf("%d",&n);
printf("依次出栈的%d个元素:\n",n);
for(i=;i<n;i++)
{
Pop_SeqStack(L,&m);
printf("%3d",m);
}
printf("\n");
Print_SeqStack(L);
printf("栈顶元素:%d\n",Top_SeqStack(L));
return ;
}
借助百度百科对于栈的介绍,利用链表的形式建了个栈,可以实现基本的操作,如进栈、出栈、判断空、打印栈中元素、返回栈顶元素。
听学长讲,貌似可以调用#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 - / * | *退栈并输出 |
对stack概念的理解与应用的更多相关文章
- atitit.闭包的概念与理解attilax总结v2 qb18.doc
atitit.闭包的概念与理解attilax总结v2 qb18.doc 1.1. 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.1 2. #---- ...
- JAVA中用堆和栈的概念来理解equals() "=="和hashcode()
在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals() ...
- 对MP4一些概念的理解
首先,对视频一些基本概念的理解: I帧:i帧又称为内编码帧,是一种自带全部信息的独立帧,可独立解码,可理解为一张静态图片,视频序列中的第一个帧始终是i帧,因为它是关键帧. P帧:P帧又称为帧间预测编码 ...
- structs2 对ActionContext valueStack stack context 的理解 图片实例
structs2 对ActionContext valueStack stack context 的理解 ActionConext : The ActionContext is the context ...
- 【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解
由于前段时间,程序偶尔异常挂起不工作,检查后发现时死锁了,原因就是:在信号处理函数里面调用了fprintf. printf等io函数是需要对输出缓冲区加锁,这类函数对本身是线程安全的,但是对信号处理函 ...
- k8s中几个基本概念的理解,pod,service,deployment,ingress的使用场景
k8s 总体概览 前言 Pod 副本控制器(Replication Controller,RC) 副本集(Replica Set,RS) 部署(Deployment) 服务(Service) ingr ...
- Pytorch中stack()方法的理解
Torch.stack() 1. 概念 在一个新的维度上连接一个张量序列 2. 参数 tensors (sequence)需要连接的张量序列 dim (int)在第dim个维度上连接 注意输入的张量s ...
- 有关基于模型的设计(MBD)一些概念和理解(zz)
http://www.matlabsky.com/thread-38774-1-1.html 本文转载于MathWorks中国高级工程师董淑成的帖子内容.为了方便阅读,对原文进行了重新整理编辑. 之前 ...
- 单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解
嵌入式设备一般要满足实时性的要求,而实时性是要求数据输入和输出的延时满足一定的要求.当然嵌入式一般都便携性都比PC要好,功能没有PC多,PC是通用,他是专用,一般只专注某些功能的实现,比如DSP专注数 ...
随机推荐
- C语言全局未初始化数据段分析
前言: 在分析C语言全局未初始化变量时,发现在目标文件中全局未初始化变量并不是直接放在bss段中. 再后来发现在两个.c文件中定义同名的全局变量,链接时居然没有发生符号重定义错误.才知道C语言弱定义的 ...
- Vim的tagbar插件
1.tagbar针对当前文件,调用ctags来生成结果,并抓取其结果,像下边这样的 ctags -f - --format=2 --excmd=pattern --extra= --fields=nk ...
- hibernate中的SessionFactory,Session分别表示什么啊?如何理解?
Session接口 Session接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会 ...
- R programming, In ks.test(x, y) : p-value will be approximate in the presence of ties
Warning message: In ks.test(x, y) : p-value will be approximate in the presence of ties The warnin ...
- 注册表删除chrome插件
注册表,对于绝大部分人来说,都是一个比较陌生的东西.然而,我们的几乎所有软件都会在这里出现. 就最近一次,公司给每个员工的chrome浏览器绑定的一堆插件,并且无法删除.手动删除插件文件后,重启机器又 ...
- 《SPFA算法的优化及应用》——姜碧野(学习笔记)
一.核心性质:三角不等式.最短路满足d[v]<=d[u]+w(u,v) 二.SPFA两种实现: 常见的是基于bfs的,这是直接对bellman-ford用队列维护.根据最短路的长度最长为(n-1 ...
- NPAIRS框架的理解
<The NPAIRS Computational Statistics Framework for Data Analysis in Neuroimaging> Strother. pe ...
- android之AlarmManager 全局定时器
AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...
- [Everyday Mathematics]20150201
设数列 $\sed{a_n}$ 单调递减趋于零, 证明 $\dps{\vsm{n}a_n}$ 收敛当且仅当 $\dps{\vsm{n}3^k a_{3^k}}$ 收敛.
- PowerDesigner Vs Enterprise Architect
注: 以下文中PD表示PowerDesigner,EA表示Enterprise Architect 最近一直在做设计方面的事情,之前一直在用PD.有个阿里过来的同事说阿里都是用EA,我就抽空小研究了一 ...