文章目录
- 1.最小栈
- 2.栈的压入、弹出序列
- 3.逆波兰表达式(后缀表达式)求值
- 3.1后缀表达式求值
- 3.2中缀表达式转后缀表达式
- 3.3带有括号的中缀表达式转后缀表达式
1.最小栈
class MinStack
{
public:MinStack(){}void push(int val){_st.push(val);//empty放在前面 因为栈为空时top会assertif (_mst.empty() || val <= _mst.top())_mst.push(val);}//注意代码顺序void pop(){if (_mst.top() == _st.top())_mst.pop();_st.pop();}int top(){return _st.top();}int getMin(){return _mst.top();}
private:stack<int> _st;stack<int> _mst;
};
2.栈的压入、弹出序列
class Solution
{//pushV:压栈顺序组// popV:出栈顺序组bool IsPopOrder(vector<int> pushV, vector<int> popV){stack<int> st;int i = 0;//遍历压栈组for (auto x : pushV){st.push(x);//top前一定判空while (!st.empty() && popV[i] == st.top()){//st非空前提下 判断出栈组与栈顶是否相同//相同i后移 -- 可视为出栈正确 -- 继续遍历++i;//将符合的栈顶数据弹出st.pop();//继续循环 -- 压栈到中途 -- 连续出栈 //此时就会有多组匹配}}//若出栈顺序正确 -- 此时下标i与size大小同//return i == popV.size();return st.empty();}
};
3.逆波兰表达式(后缀表达式)求值
3.1后缀表达式求值
class Solution
{
public://Evaluate inverse Polish notationint evalRPN(vector<string>& tokens){stack<long long> st;for (auto& str : tokens){if (str == "+" || str == "-" || str == "*" || str == "/" ){long long right = st.top();st.pop();long long left = st.top();st.pop();switch (str[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(stoll(str));}}return st.top();}
};
3.2中缀表达式转后缀表达式
1.操作数输出
2.操作符:
2.1栈为空或此操作符比栈顶操作符优先级高:压栈
2.2此操作符比栈顶操作符优先级低或相等:输出并pop
3.3带有括号的中缀表达式转后缀表达式
1.操作数输出
2.操作符:
2.1栈为空或此操作符比栈顶操作符优先级高:压栈
2.2此操作符比栈顶操作符优先级低或相等:输出并pop
2.3若遇到左括号:此后的第一个操作符默认运算级最高