目录
一、最小栈
题目:
思路:
- 定义两个栈,一个表示普通的栈st,另一个表示最小栈minst
- push:入栈st;如果minst为空或者要进入的数据小于等于minst的栈顶元素,就入栈
- pop:出栈st;如果st的栈顶元素等于minst的栈顶元素,minst就出栈。注意顺序,先用st的栈顶元素进行比较,不管比较是否进入判断条件,再st.pop
- 返回st的栈顶元素;返回minst的栈顶元素
代码:
cpp
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
st.push(x);
if(minst.empty() || x <= minst.top())
minst.push(x);
}
void pop() {
// 先比较,再删除
if(st.top() == minst.top())
minst.pop();
st.pop();// 是栈顶的,注意顺序
}
int top() {
return st.top();
}
int getMin() {
return minst.top();
}
stack<int> st, minst;
};
二、栈的压入弹出
题目:
思路:栈
- 循环,入栈序列全部入栈结束
- 入栈序列进栈,下标++
- 循环,栈不为空的情况下,栈顶元素与出栈序列比较,相等,下标++,并且栈pop;否则不进入循环
- 最后出栈序列的下标等于出栈序列的个数,说明全部匹配,返回true;否则返回false
代码:
cpp
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> st;
int i = 0, j = 0;
while(i < pushV.size())
{
st.push(pushV[i++]);
while(!st.empty() && st.top() == popV[j])
{
st.pop();
j++;
}
}
if(j == popV.size()) return true;
else return false;
}
三、逆波兰表达式求值
题目:
思路:栈
- 因为题目已经给了后缀表达式,所以可以使用
- 是操作数,入栈
- 是操作符,取出栈顶的两个元素,完成该操作符的运算,再放入栈
- 最后返回栈顶元素就是结果
代码:
cpp
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(auto &e : tokens)
{
if(e == "+" || e == "-" || e == "*" || e == "/")
{
int right = st.top();
st.pop();
int left = st.top();
st.pop();
switch(e[0])
{
case '+':
st.push(left+right);
break;
case '-':
st.push(left-right);
break;
case '*':
st.push(left*right);
break;
case '/':
st.push(left/right);
break;
}
}
else
{
st.push(stoi(e));
}
}
return st.top();
}
};