目录
题目链接与简介
题目一
1.算法思路
2.总结心得
3.可执行代码
题目二
1.算法思路
2.总结心得
3.可执行代码
题目三
1.算法思路
2.总结心得
3.可执行代码
题目链接与简介
1.逆波兰表达式求值
2.最小栈
3.剑指 Offer 31. 栈的压入、弹出序列
题目一
LeetCode 150.逆波兰表达式求值
1.算法思路
先看一下示例,其实就是将后缀表达式转为中缀表达式。
思路如下:
- 遍历所给字符串数组中,如果是操作数就入栈,如果是操作符就进行处理。
- 当碰到操作符时,取出栈顶元素top1和top2,将其运算结果再放入栈中。
2.总结心得
- 因为传入的为字符串数组,所以我们要将字符串转整形,使用 stoi() 函数。
- 运算是连续的,所以我们可以直接调用push将运算结果放入栈中。
3.可执行代码
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(auto e:tokens)
{
if (e=="+")
{
long long top1=st.top();
st.pop();
long long top2=st.top();
st.pop();
st.push(top2+top1);
}
else if (e=="-")
{
long long top1=st.top();
st.pop();
long long top2=st.top();
st.pop();
st.push(top2-top1);
}
else if (e=="*")
{
long long top1=st.top();
st.pop();
long long top2=st.top();
st.pop();
st.push(top2*top1);
}
else if (e=="/")
{
long long top1=st.top();
st.pop();
long long top2=st.top();
st.pop();
st.push(top2/top1);
}
else
{
st.push(stoi(e));
}
}
return st.top();
}
};
题目二
LeetCode 155.最小栈
1.算法思路
这道题目就是自己设置设置一个具有特殊接口的栈,该接口的功能是可以获得栈中的最小元素.
所以我们的思路就是在类中创建两个栈,一个栈用于正常的存放数据,一个栈用于存放历史以来的最小值。
- 入栈时,直接将栈中元素放入st1中;
- 如果get_min栈为空,或者是插入的值小于get_min中的值,就往get_min中进行插入。
- 出栈时,如果栈不为空,直接删除栈顶元素,
- 如果栈顶元素为最小栈中的数据,则最小栈也要进行删除。
2.总结心得
- 在插入时,判断当前值是不是最小值要记得判断最小栈是否为空,还要防止二次插入最小值
- 应是 val<=get_min.top(),因为是存在最小值相等的情况的。
- 删除时,应以栈不为空为前提。
3.可执行代码
MinStack() { }
void push(int val) {
// 1.直接将栈中元素放入st1中
// 2.如果get_min栈为空,或者是插入的值小于get_min中的值,就往get_min中进行插入
st1.push(val);
if (get_min.empty()) get_min.push(val);
else if (val<=get_min.top()) get_min.push(val);
}
void pop() {
// 1.如果栈不为空,直接删除栈顶元素
// 2.如果栈顶元素为最小栈中的数据,则最小栈也要进行删除
if (!st1.empty())
{
int temp=st1.top();
if (get_min.top()==temp)
get_min.pop();
st1.pop();
}
}
int top() {
return st1.top();
}
int getMin() {
return get_min.top();
}
private:
stack<int> st1;
stack<int> get_min;
};
题目三
剑指 Offer 31. 栈的压入、弹出序列
1.算法思路
该题目的意思其实是我们常见的一道栈相关的选择题,给出入栈序列,判断出栈序列是否正确。
遍历入栈序列,往栈中插入数据。
每当我们插入一个数据时,我们就判断该数据是否为出栈序列的第 i 个元素(popi=0)
如果是出栈序列的顺序中的第popi个元素,则 popi ++,表示出栈序列的第popi个出栈合理,并进行删除栈顶元素。
当数据插入结束时,如果栈为空或popi==poped.size(),表示出栈序列符合先进先出,反之,则出战序列错误。
2.总结心得
难点就在于中间的循环
中间的循环模拟的就是我们在任意时刻出栈的过程(重点)。
理解上面这句话就可以说理解了这道题目,我们回忆我们做题时的思路,每当压入一个元素后,就判断此时出栈是否符合出栈序列,如果我们用代码实现该思考过程,就是中间这个循环的这个比对过程。
3.可执行代码
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> st;
int popi = 0;
for(auto e:pushed)
{
st.push(e);
while((!st.empty())&&st.top()==popped[popi])
{
st.pop();
popi++;
}
}
return st.empty();
}
};