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概念的理解与应用的更多相关文章

  1. atitit.闭包的概念与理解attilax总结v2 qb18.doc

    atitit.闭包的概念与理解attilax总结v2 qb18.doc 1.1. 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.1 2. #---- ...

  2. JAVA中用堆和栈的概念来理解equals() "=="和hashcode()

    在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals() ...

  3. 对MP4一些概念的理解

    首先,对视频一些基本概念的理解: I帧:i帧又称为内编码帧,是一种自带全部信息的独立帧,可独立解码,可理解为一张静态图片,视频序列中的第一个帧始终是i帧,因为它是关键帧. P帧:P帧又称为帧间预测编码 ...

  4. structs2 对ActionContext valueStack stack context 的理解 图片实例

    structs2 对ActionContext valueStack stack context 的理解 ActionConext : The ActionContext is the context ...

  5. 【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解

    由于前段时间,程序偶尔异常挂起不工作,检查后发现时死锁了,原因就是:在信号处理函数里面调用了fprintf. printf等io函数是需要对输出缓冲区加锁,这类函数对本身是线程安全的,但是对信号处理函 ...

  6. k8s中几个基本概念的理解,pod,service,deployment,ingress的使用场景

    k8s 总体概览 前言 Pod 副本控制器(Replication Controller,RC) 副本集(Replica Set,RS) 部署(Deployment) 服务(Service) ingr ...

  7. Pytorch中stack()方法的理解

    Torch.stack() 1. 概念 在一个新的维度上连接一个张量序列 2. 参数 tensors (sequence)需要连接的张量序列 dim (int)在第dim个维度上连接 注意输入的张量s ...

  8. 有关基于模型的设计(MBD)一些概念和理解(zz)

    http://www.matlabsky.com/thread-38774-1-1.html 本文转载于MathWorks中国高级工程师董淑成的帖子内容.为了方便阅读,对原文进行了重新整理编辑. 之前 ...

  9. 单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解

    嵌入式设备一般要满足实时性的要求,而实时性是要求数据输入和输出的延时满足一定的要求.当然嵌入式一般都便携性都比PC要好,功能没有PC多,PC是通用,他是专用,一般只专注某些功能的实现,比如DSP专注数 ...

随机推荐

  1. 查看EBS中BI Publisher的版本

    查看EBS中BI Publisher的版本问题,Oracle提供了如下的几种方法: 从BI Publisher产生的报表文件查看 通过系统已打过的补丁(Patch)来决定,通过补丁号和BI Publi ...

  2. gsp序列模式挖掘

    数据挖掘进阶之序列模式挖掘GSP算法 绪 继续数据挖掘方面算法的讲解,前面讲解了数据挖掘中关联规则算法FP-Growth的实现.此篇博文主要讲解基于有趣性度量标准的GSP序列模式挖掘算法.有关论文后期 ...

  3. Asp.net 后台添加Meta标签方法

    Asp.net 后台添加Meta标签方法包括keywords,CSS.JS 下面是从Asp.net 后台添加CSS.JS.Meta标签的写法,我们这里写成函数方便以后使用.如果函数放在页面类中, Pa ...

  4. 如何解决:ERROR: the user data image is used by another emulator. aborting 的问题

    问题概述: 在启动Android模拟器时出现以下错误,导致启动失败. ERROR: the user data image is used by another emulator. aborting. ...

  5. 脚本AI与脚本引擎

    Scripted AI and Scripting Engines 脚本AI与脚本引擎 This chapter discusses some of the techniques you can us ...

  6. ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking

    #!/bin/bash # # ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking # 说明: # 本文主 ...

  7. js spin 加载动画(loading)

    js spin 加载动画 最近做页面ajax加载是又用到loading动画,还好有一个spin.js 具体的包大家可以去http://fgnass.github.com/spin.js/下载, 如果想 ...

  8. .Net中的各种序列化

    我们知道将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本这正是数据持久化所要做的.而且,不同应用程序之间的通讯需要相互传输数据.那么序列化和反序列化正是为此而生. 序列化和反序列化 所谓 ...

  9. grep的-A-B-选项详解(转)

    grep的-A-B-选项详解(转)[@more@] grep能找出带有关键字的行,但是工作中有时需要找出该行前后的行,下面是解释 1. grep -A1 keyword filename 找出file ...

  10. oracle归档日志增长过快处理方法

    oracle归档日志一般由dml语句产生,所以增加太快应该是dml太频繁 首先查询以下每天的归档产生的情况: SELECT TRUNC(FIRST_TIME) "TIME", SU ...