STL函数库的应用第三弹——数据结构(栈)
Part 1:栈是什么
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
——来自百度百科
那么栈通俗来讲是什么意思呢?
大家可以想象一下餐厅清洁工。
假如笔者是一个可怜的洗碗工,当顾客吃完饭的时候,盘子总是堆成一堆,摆在我面前。
我每次只能拿最上面的那个盘子清洗。(拿最下面的会倒塌打碎盘子)
比如有三个盘子,我每分钟可以清洗一个盘子,当我清洗完第二个的时候,很不幸,又来了三个盘子。
所以我只能先清洗第二次来的那三个盘子。具体模拟情况如下。

结合图片(我手画的很丑),我们不难看出,当第一次给我三个盘子的时候,第一个盘子在最下面。
最后给我的3号盘子被优先清洗,第二次给我3个盘子的时候,最先进入的4号盘子在最下面,最后进入的6号盘子在最上面,也是最先清洗的。
这就是“栈(stack)”——一种先进后出的数据结构。
Part 2:栈能做什么?
很多,比如后缀表达式求值,或者自动监测括号匹配等等。今天的例题就是后缀表达式求值问题。
Part 3:如何模拟栈?
如果您是dalao,可以用各种指针手写栈,但是如果嫌麻烦的话,STL库里有与栈相关的函数和数据结构。
#include<stack>
这是STL栈的头文件,包含以下函数。
首先声明栈,声明方式为stack<数据类型>名字;
比如stack<int>s;
s.empty() 如果栈为空返回true,否则返回false
s.size() 返回栈中元素的个数
s.pop() 删除栈顶元素
s.top() 指向栈顶的元素的指针
s.push() 在栈顶压入新元素
使用方式也和STL队列大同小异。
Part 4:例题,后缀表达式
相信大家在这时已经大概理解了什么是栈,以及栈的使用方法,上一个简单的例题
洛谷P1449 后缀表达式

首先我们说说后缀表达式到底是个什么东西。
题目中已经给了描述,大概意思就是只要遇到了任何一个运算符号,我们就把之前的两个数用这个运算符运算变成一个数,然后继续向后进行。
我这里提供一种思路(仅供参考,dalao们请自觉退出,避免窥探蒟蒻的世界)
我们可以维护一个栈。
我们按顺序检索表达式,把数字入栈,当检索到一个运算符的时候,就把之前进入栈的两个数拿出来运算,然后把运算后的新数再次入栈
如此进行直到表达式结束。
问题又来了,怎么把数字由字符类型变成int类型来计算呢?
这里我用了更加蒟蒻的方法,队列+乘方。
请dalao们康康伪代码。
char read[];
int len2=-,x;//注意是-1,如果是0会导致数字变成原来的10倍
queue<int>q;
stack<int>stk;
if(''<=read[i]&&read[i]<='')
{
mmp=read[i]-'';//当检测到的字符是一个数字的时候,把他转化为int类型的数字
q.push(mmp);//进入队列
len2++;//数字长度(位数)++
}
if(read[i]=='.')//当检测到"."的时候,说明这个数字已经读完了
{
while(q.size()!=)//当队列不为空的时候,执行以下操作
{
x+=q.front()*pow(,len2);//用队列的第一个元素乘以10的len2次方,然后累加
q.pop();//弹出队首
len2--;//长度--
}
stk.push(x);//检测完这个数字,把它压栈
x=;//清零变量,准备下一次读入
}
这是我把字符数转化为int数的方法,代码注释已经很详细了,这里不多BB
(欢迎大佬提出更好的想法狙击我)
既然数据类型转化做完了,下面的工作就明朗起来了,只要读入运算符,就弹出栈的前两个元素,然后执行运算操作,把新数压入栈顶就OK了
下面是本蒟蒻的完整AC代码:
//P1449
//#include<zhangtao.std>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<queue>
#include<cmath>//一堆头文件,遵循“就算饿死,从这里跳下去,也不开万能头”的原则
using namespace std;
char read[];
int len1,mmp,len2=-,x,a,b;
stack<int>stk;
queue<int>q;
int main()
{
scanf("%s",read);//读入字符串,超级香的scanf
len1=strlen(read);//统计字符数组长度
for(int i=;i<len1;i++)//检索整个字符数组
{
if(''<=read[i]&&read[i]<='')
{
mmp=read[i]-'';
q.push(mmp);
len2++;
}
if(read[i]=='.')
{
while(q.size()!=)
{
x+=q.front()*pow(,len2);
q.pop();
len2--;
}
stk.push(x);
x=;
}//上面的刚才已经提到过
if(read[i]=='-')
{
a=stk.top();//存下第一个元素
stk.pop();//弹出
b=stk.top();//存下第二个元素
stk.pop();//弹出
stk.push(b-a);//执行减法操作,把结果入栈
}
if(read[i]=='+')
{
a=stk.top();
stk.pop();
b=stk.top();
stk.pop();
stk.push(b+a);
}//同上
if(read[i]=='*')
{
a=stk.top();
stk.pop();
b=stk.top();
stk.pop();
stk.push(b*a);
}//同上
if(read[i]=='/')
{
a=stk.top();
stk.pop();
b=stk.top();
stk.pop();
stk.push(b/a);
}//本题的数据可以直接除(满足C++int类型除法的运算原则)
}
cout<<stk.top();//输出最后一个元素(即为结果)
return ;
}
好了今天的分享(水博)就到这里,同学们下次再见!(下次可能又一个月之后了)
STL函数库的应用第三弹——数据结构(栈)的更多相关文章
- 分治算法(二分查找)、STL函数库的应用第五弹——二分函数
分治算法:二分查找!昨天刚说不写算法了,但是突然想起来没写过分治算法的博客,所以强迫症的我…… STL函数库第五弹——二分函数lower_bound().upper_bound().binary_se ...
- STL函数库的应用第四弹——全排列(+浅谈骗分策略)
因为基础算法快学完了,图论又太难(我太蒻了),想慢慢学. 所以暂时不写关于算法的博客了,但又因为更新博客的需要,会多写写关于STL的博客. (毕竟STL函数库还是很香的(手动滑稽)) 请出今天主角:S ...
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- ----堆栈 STL 函数库 ----有待补充
#include<cstdio> #include<string> #include<vector> #include<iostream> using ...
- STL函数库的应用第一弹——数据结构(队列)
队列是什么? 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作. 和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头 ...
- STL函数库的应用第二弹——快排sort函数与结构体关键字排序
时隔20多天,本蒟蒻终于记起了他的博客园密码!!! 废话不多说,今天主题:STL快排函数sort()与结构体关键字排序 Part 1:引入和导语 首先,我们需要知道,algorithm库里有一些奇怪的 ...
- javaweb学习总结(三十)——EL函数库
一.EL函数库介绍 由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用. 这些EL函数在JSTL开发包中进行描述,因此在JSP页 ...
- Linux c codeblock的使用(三):使用函数库
(一)概念 什么是函数库呢?一下子说概念大家可能不太熟悉,但是这实际上是大家在windows系统上经常见到的东西.没错,就是那些后缀为DLL的文件. linux上实际也有自己的函数库文件,文件类型为. ...
- STL标准库-容器-deque
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...
随机推荐
- k_means算法+python实现
文章目录 一.原理 二.算法步骤 三.实例如下: 四.python代码实现: 一.原理 K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方 ...
- 【JVM之内存与垃圾回收篇】虚拟机栈
虚拟机栈 虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同 ...
- 搭建kubernetes集群
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- [spring] -- AOP、IOC、DI篇
AOP(面向切面编程) 怎么理解这个切面编程的概念及优点? 概念: 横切关注点与业务逻辑相分离,切面能帮助我们模块化横切关注点: 优点: 现在每个关注点都集中于一个地方,而不是分散到多处代码中: 服务 ...
- 最小割&网络流应用
重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...
- 前端学习(六):body标签(四)
进击のpython ***** 前端学习--body标签 关于前面的都是大部分的标签内容 但是就像衣服一样,除了要有,还要放到适当的位置 我们先来看看一下网页的布局: 就可以看出来,网页都是一块一块的 ...
- android 官方教程地址和一个中文教程
https://developer.android.google.cn/guide/components/fundamentals http://www.runoob.com/w3cnote/andr ...
- python基础--14大内置模块(下)
(9)正则表达式和re模块(重点模块) 在我们学习这个模块之前,我们先明确一个关系.模块和实际工作的关系. 1)模块和实际工作时间的关系 1.time模块和时间是什么关系?time模块和时间本身是没有 ...
- Spring+hibernate无法执行更新操作
如果你幸运的使用springmvc+hibernate你应该检查以下springmvc的扫面范围是否是和spring framework的事务范围有冲突,虽然是公用容器,但是事务这块却不能公用的,sp ...
- Python List len()方法
描述 len() 方法返回列表元素个数.高佣联盟 www.cgewang.com 语法 len()方法语法: len(list) 参数 list -- 要计算元素个数的列表. 返回值 返回列表元素个数 ...