【刷题17】最小栈、栈的压入弹出、逆波兰表达式

目录

一、最小栈

题目:

思路:

  • 定义两个栈,一个表示普通的栈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();
    }
};
相关推荐
C+-C资深大佬13 分钟前
C++风格的命名转换
开发语言·c++
啊阿狸不会拉杆14 分钟前
《数字图像处理》第 7 章 - 小波与多分辨率处理
图像处理·人工智能·算法·计算机视觉·数字图像处理
No0d1es16 分钟前
2025年粤港澳青少年信息学创新大赛 C++小学组复赛真题
开发语言·c++
点云SLAM19 分钟前
C++内存泄漏检测之手动记录法(Manual Memory Tracking)
开发语言·c++·策略模式·内存泄漏检测·c++实战·new / delete
好评12422 分钟前
【C++】二叉搜索树(BST):从原理到实现
数据结构·c++·二叉树·二叉搜索树
zylyehuo23 分钟前
error: no matching function for call to ‘ros::NodeHandle::param(const char [11], std::string&, const char [34])’
c++·ros1
程序猿炎义1 小时前
【Easy-VectorDB】Faiss数据结构与索引类型
数据结构·算法·faiss
星火开发设计1 小时前
C++ 函数定义与调用:程序模块化的第一步
java·开发语言·c++·学习·函数·知识
天赐学c语言2 小时前
1.20 - x的平方根 && vector的扩容机制以及删除元素是否会释放内存
c++·算法·leecode
CC.GG2 小时前
【C++】用哈希表封装myunordered_map和 myunordered_set
java·c++·散列表