个人主页 : zxctscl
如有转载请先通知
题目
- 1. 155. 最小栈
- 1.1 分析
- 1.2 代码
- 2. JZ31 栈的压入、弹出序列
- 2.1 分析
- 2.2 代码
- 3. 150. 逆波兰表达式求值
- 3.1 分析
- 3.2 代码
1. 155. 最小栈
1.1 分析
利用两个栈,一个栈a负责入数据和出数据,另一个_min负责放存入数据中目前最小的数。
如果_min中没有数据,那么a入数据的时候,它也入。但是_min里面放的是a中目前最小的数据,所以如果数据小于_min的top所放的数据时也插入。那么相等时候的的数据_min插不插入呢?
当然val和_min.top()数据相同时候也插入。因为再删除数据的时候,当a栈顶出栈的时候,_min栈顶同时也得出栈,这样才能保证_min.top()里面能够保存的是最小值。
所以pop得这样写:
void pop() {if(a.top()==_min.top()){ _min.pop();}a.pop();}
题目要求返回最小值,那么就是返回_min.top():
int getMin() {return _min.top();}
1.2 代码
class MinStack {
public:MinStack() { }void push(int val) {a.push(val);if(_min.empty()||val<= _min.top()){_min.push(val);}}void pop() {if(a.top()==_min.top()){ _min.pop();}a.pop();}int top() {return a.top();}int getMin() {return _min.top();}stack<int> a;stack<int> _min;
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/
2. JZ31 栈的压入、弹出序列
2.1 分析
这里用了两个栈,想要匹配出栈的顺序,最简单的方法就是:
先把入栈序列入栈,如果出现入栈序列和出栈序列的栈顶元素相同,那么两边就同时出数据,直到入栈序列和出栈序列的栈顶元素不匹配,或者出栈序列为空。
想要知道最后匹不匹配就直接判断一下入栈序列是否为空。为空就是已经匹配,否则就不匹配。
2.2 代码
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pushV int整型vector * @param popV int整型vector * @return bool布尔型*/bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code hereint pushi=0,popi=0;stack<int> st;while(pushi<pushV.size()){st.push(pushV[pushi++]);while(!st.empty()&&st.top()==popV[popi]){++popi;st.pop();}}return st.empty();}
};
3. 150. 逆波兰表达式求值
3.1 分析
逆波兰表达式就是后缀表达式,而我们一般用的是中缀表达式。
举个例子:把中缀表达式换成后缀表达式
用例1来分析一下:
在没有遇到第一个算符之前,就把数据入栈,当遇到运算符,就把它前面两个数2和1出,计算出来结果就是2+1=3,然后再把这个3再入栈;当再一次遇到表达式时候,又把它的前面两个数出栈做对应的运算之后,在把算出的结果入栈,最后输出栈顶元素就可以了。
3.2 代码
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;set<string> s={"+","-","*","/"};for(auto&str:tokens){if(s.find(str)!=s.end()){int right=st.top();st.pop();int 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(stoi(str));}}return st.top();}};
有问题请指出,大家一起进步!!!