leetcode150/155. 逆波兰表达式求值、最小栈;剑指 Offer 31. 栈的压入、弹出序列

目录

题目链接与简介

题目一

1.算法思路

2.总结心得

3.可执行代码

题目二

1.算法思路

2.总结心得

3.可执行代码

题目三

1.算法思路

2.总结心得

3.可执行代码


题目链接与简介

1.逆波兰表达式求值

2.最小栈

3.剑指 Offer 31. 栈的压入、弹出序列

题目一

LeetCode 150.逆波兰表达式求值


1.算法思路

先看一下示例,其实就是将后缀表达式转为中缀表达式。

思路如下:

  1. 遍历所给字符串数组中,如果是操作数就入栈,如果是操作符就进行处理。
  2. 当碰到操作符时,取出栈顶元素top1和top2,将其运算结果再放入栈中。

2.总结心得

  1. 因为传入的为字符串数组,所以我们要将字符串转整形,使用 stoi() 函数。
  2. 运算是连续的,所以我们可以直接调用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.算法思路

这道题目就是自己设置设置一个具有特殊接口的栈,该接口的功能是可以获得栈中的最小元素.

所以我们的思路就是在类中创建两个栈,一个栈用于正常的存放数据,一个栈用于存放历史以来的最小值。

  1. 入栈时,直接将栈中元素放入st1中;
  2. 如果get_min栈为空,或者是插入的值小于get_min中的值,就往get_min中进行插入。
  3. 出栈时,如果栈不为空,直接删除栈顶元素,
  4. 如果栈顶元素为最小栈中的数据,则最小栈也要进行删除。

2.总结心得

  1. 在插入时,判断当前值是不是最小值要记得判断最小栈是否为空,还要防止二次插入最小值
  2. 应是 val<=get_min.top(),因为是存在最小值相等的情况的。
  3. 删除时,应以栈不为空为前提。

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.算法思路

该题目的意思其实是我们常见的一道栈相关的选择题,给出入栈序列,判断出栈序列是否正确。


  1. 遍历入栈序列,往栈中插入数据。

  2. 每当我们插入一个数据时,我们就判断该数据是否为出栈序列的第 i 个元素(popi=0)

  3. 如果是出栈序列的顺序中的第popi个元素,则 popi ++,表示出栈序列的第popi个出栈合理,并进行删除栈顶元素。

  4. 当数据插入结束时,如果栈为空或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();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值