前言:
栈本质上是一个比较简单的容器,算法题里有直接考察栈的先进后出的特性,也有跟其他算法相结合,还是挺有意思的,难度也适中

(图片来源网络,侵删)
一、JZ31 栈的压入、弹出序列
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
解析:
1、入栈序列:先让当前数据入栈

(图片来源网络,侵删)
2、栈顶元素跟出栈元素序列比较,是否相等
如果相等:出栈,出栈序列++,直到栈为空,或者不相等。如果不相等,再让入栈序列入栈。
结束的判断条件:
1、出栈序列走到尾,说明全匹配(true)
2、栈顶元素和出栈序列匹配不上,且入栈序列已经走完,没有数据可以入栈(false)
原码:
bool IsPopOrder(vector& pushV, vector& popV) { stack st; int pushi = 0,popi = 0;//定义下标名称有讲究 while(pushi二、1047. 删除字符串中的所有相邻重复项
题目描述:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
解析:
这题明显是利用栈进行解决,这里有个技巧,就是我们不用真的栈容器去解决,我们用数组模拟一个栈即可,这样会更加简洁!!!
原码:
class Solution { public: string removeDuplicates(string s) { string ret;//模拟栈结构即可~ for(auto ch : s) { if(ret.size() && ret.back() == ch)//出栈 ret.pop_back(); else ret += ch;//入栈 } return ret; } };三、227. 基本计算器 II
题目描述:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2" 输出:7解析:
一般需要符号栈、数据栈,两个。但是,看到网上一个写的不错的算法,只用了一个数据栈。符号栈用一个变量op代替了,只存储上一个符号。
1、遇到操作符:更新操作符
2、遇到数字:
- op == '+' ,tmp直接入栈
- op == '-',-tmp入栈
- op == '*',直接乘到栈顶元素上
- op == '/',直接除到栈顶元素上
原码:
class Solution { public: int calculate(string s) { //第一位加上+,便于后面编程 char sign = '+';//模拟符号栈 vector arr;//模拟数据栈 arr.resize(s.size()); int i = 0; int index = 0; while(i = '0' && s[i] = '0' && s[i]