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. <<c 和指针 >> 部分笔记。

    最近竟然对指针有些迷惑了,分不清指针的指向.废话少说,复习.(下面内容来自<<c和指针>>) =指针 ==内存和地址 尽管一个字包含了4个字节,它仍然只有一个地址.至于是最左边 ...

  2. C#获取ip的示例

    界面 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using ...

  3. BZOJ 2326 数学作业(矩阵)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2326 题意:定义Concatenate(1,N)=1234567……n.比如Concat ...

  4. JasperReports+iReport在eclipse中的使用

    转载:http://blog.csdn.net/daming924/article/details/7402295 一.介绍1)它可以PDF,HTML,XML等多种形式产生报表或动态报表,在新版本还支 ...

  5. 關於NPOI的一點補充和示例

    最近看到很多人分享NPOI的用法. 但是很多都不是完整示例或者並沒有實戰效果. 剛好最近有個VB.NET的項目有升級原有的oledb select sheet$的做法. 很明顯,NPOI有更好的穩定性 ...

  6. UVa 11361 (计数 递推) Investigating Div-Sum Property

    题意: 统计[a, b]中有多少个数字满足:自身是k的倍数,而且各个数字之和也是k的倍数. 分析: 详细分析见<训练之南>吧,=_=|| 书上提出了一个模板的概念,有了模板我们就可以分块计 ...

  7. "xxxx".zip:这个压缩文件格式未知或者数据已经被损坏,打不开压缩文件,总出现这个提示的解决方法

    从网上下载了一些压缩文件,有时解压时会出现“这个压缩文件格式未知或者数据已经被损坏”或“未找到压缩文件”的提示. 造成的原因有两种: 一.网站上的压缩文件本来就是坏的. 1.你可以尝试可以使用WINR ...

  8. 模仿 "淘宝彩票" 的随机选球投注效果!

    我个人比较喜欢看网页的效果,前几天看了淘宝的“淘宝彩票”,今天仿造做了一个,我觉得比淘宝的体验要好. 查看 “淘宝彩票” 的网页源码发现,主要是用到了Css3 transform 的 Matrix 来 ...

  9. Java [Leetcode 337]House Robber III

    题目描述: The thief has found himself a new place for his thievery again. There is only one entrance to ...

  10. 快速搭建建SSH服务

    一般来说如果用Ubuntu作为服务器,我们经常需要通过其他客户端远程连接它. 远程连接需要使用SSH,这里列出了一个快速完成这一任务的方法. 键入命令 # sudo apt-get install o ...