【算法】栈和队列专题

专题一:栈系列


1. 中缀表达式转后缀表达式(逆波兰式)


在这里插入图片描述

算法原理
在这里插入图片描述


2. 有效的括号


题目链接

算法原理

在这里插入图片描述

代码编写

class Solution 
{
public:
    bool isValid(string s) 
    {
        stack<char> st;
        for(const auto ch : s)
        {
            if(ch == '(' || ch == '[' || ch == '{') st.push(ch);
            else 
            {
                // 1、右括号多
                if(st.empty()) return false;

                char top = st.top();
                if(top == '(' && ch == ')' || top == '[' && ch == ']' || top == '{' && ch == '}') 
                    st.pop();
                else 
                    return false; // 2、括号不匹配
            }
        }

        return st.empty(); // 3、最后若栈为空,说明左括号全部正确匹配完成
    }
};

3. 用栈实现队列


题目链接

算法原理
在这里插入图片描述

代码编写

class MyQueue 
{
private:
    stack<int> st1; //负责入队列
    stack<int> st2; //负责出队列

public:
    // 构造函数,什么都不需要做
    MyQueue() 
    {}
    
    // 入队列
    void push(int x) 
    {
        st1.push(x);
    }
    
    // 出队列
    int pop() 
    {
        // 队列为空,则返回-1
        if(st1.empty() && st2.empty()) return -1;   
        // 若 st2 为空,则需要从 st1 中把元素更新过来
        if(st2.empty()) 
        {
            while(!st1.empty()) 
            {
                st2.push(st1.top());
                st1.pop();
            }
        }
        //  st2 栈顶元素即使队列的对首元素,删除即可
        int ans = st2.top();
        st2.pop();
        return ans;
    }
    
    int peek() 
    {
        // 队列为空,则返回-1
        if(st1.empty() && st2.empty()) return -1;
        // 若 st2 为空,则需要从 st1 中把元素更新过来
        if(st2.empty())
        {
            while(!st1.empty()) 
            {
                st2.push(st1.top());
                st1.pop();
            }
        }
        //  st2 栈顶元素即使队列的对首元素,返回即可
        return st2.top();
    }
    
    // 队列判空
    bool empty() 
    {
        return st1.empty() && st2.empty();
    }
};

4. 最小栈


题目链接

算法原理
在这里插入图片描述

代码编写

class MinStack 
{
private:
    stack<int> st;   //存放栈元素
    stack<int> minSt;//存放st中,最小元素序列

public:
    // 默认构造函数
    MinStack() 
    {}
    
    // 栈中插入元素
    void push(int val) 
    {
        st.push(val);
        // 1、若最小栈为空(说明是第一个插入元素),此时 val 直接入最小栈
        // 2、若最小栈不为空,则比较最小栈栈顶元素,再决定是否插入最小栈
        if(minSt.empty()) minSt.push(val);
        else
        {
            if(val <= minSt.top()) minSt.push(val);
        }
    }
    
    // 弹出栈顶元素
    void pop() 
    {
        // 若栈顶元素为栈中最小元素,则需要同步更新最小栈
        if(st.top() == minSt.top()) minSt.pop();
        // 弹出栈顶元素
        st.pop();
    }
    
    // 获取栈顶元素
    int top() 
    {
        return st.top();
    }
    
    // 获取栈中最小元素
    int getMin() 
    {
        return minSt.top();
    }
};
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值