• 算法模型总结:栈与队列


    1.栈实现队列

    232. 用栈实现队列

    使用两个栈来实现队列,其中一个栈用来入,一个栈用来出,当要插入或者删除数据的时候,将数据从一个栈导入到要操作的栈即可。‘

    class MyQueue {
    private: 
        stack s1;
        stack s2;
    public:
        MyQueue() {
            
        }
        void exchange(stack& s1,stack& s2)
        {
            int temp;
            while(!s1.empty())
            {
                temp=s1.top();
                s1.pop();
                s2.push(temp);
            }
        }
        void push(int x) {
            exchange(s2,s1);
            s1.push(x);
        }
        
        int pop() {
            exchange(s1,s2);
            int temp=s2.top();
            s2.pop();
            return temp;
        }
        int peek() {
            exchange(s1,s2);
            return s2.top();
        }
        bool empty() {
            return s1.empty()&&s2.empty();
        }
    };
    
    /**
     * Your MyQueue object will be instantiated and called as such:
     * MyQueue* obj = new MyQueue();
     * obj->push(x);
     * int param_2 = obj->pop();
     * int param_3 = obj->peek();
     * bool param_4 = obj->empty();
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    2.队列实现栈

    225. 用队列实现栈

    使用一个队列就可以实现栈,当入栈的时候再队尾插入,出栈的时候依次将队首的元素移动到队尾,当找到最后一个元素的时候将它出栈。

    class MyStack {
    private:
        queue q;
    public:
        MyStack() {
    
        }
        
        void push(int x) {
            q.push(x);
        }
        
        int pop() {
            int size=q.size()-1;
            while(size--)
            {
                int tmp=q.front();
                q.pop();
                q.push(tmp);
            }
            int tmp=q.front();
            q.pop();
            return tmp;
        }
        
        int top() {
            return q.back();
        }
        
        bool empty() {
            return q.empty();
        }
    };
    
    /**
     * Your MyStack object will be instantiated and called as such:
     * MyStack* obj = new MyStack();
     * obj->push(x);
     * int param_2 = obj->pop();
     * int param_3 = obj->top();
     * bool param_4 = obj->empty();
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    3.有效的括号

    20. 有效的括号

    给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    每个右括号都有一个对应的相同类型的左括号。

    遍历整个数组,如果遇到左括号,则将括号入栈,如果遇到右括号,看栈顶元素是不是该右括号,是则出栈,不是则退出。

    class Solution {
    public:
        bool isValid(string s) {
            stack S;
            for(int i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    4.删除字符串中所有相邻重复项

    1047. 删除字符串中的所有相邻重复项

    给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

    在 S 上反复执行重复项删除操作,直到无法继续删除。

    在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

    用栈来操作,遍历整个数组,判断和栈顶元素是否相同,如果相同则出栈,不同则入栈。

    class Solution {
    public:
        string removeDuplicates(string s) {
            stack S;
            for(int i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    5.逆波兰表达式求值

    150. 逆波兰表达式求值根据 逆波兰表示法,求表达式的值。

    有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

    注意 两个整数之间的除法只保留整数部分。

    可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

    输入:tokens = ["2","1","+","3","*"]
    输出:9
    解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
    
    • 1
    • 2
    • 3

    遇到数字入栈,遇到符号则将符号前两个数计算并出栈,将结果进行入栈。

    class Solution {
    public:
        int evalRPN(vector& tokens) {
            stack S;
            for(int i=0;i

6.滑动窗口最大值

239. 滑动窗口最大值

使用的是一个单调队列
在这里插入图片描述

使用deque这个数据结构建立单调队列。

对于单调队列,当插入的数据比它前一个数据大的时候,将前一个数据从队列后出队列,然后再向前依次比较,最终将该数据插入。这样就保证了队列首元素始终都是最大的元素。

当要主动出队列的时候,只有一种情况,那就是队列满了,此时我们知道要出队列的是哪个元素,因此我们判断队列首是哪个元素,如果是要出队列的,直接出队列即可。

class Myqueue
{
    private:
        deque q;
    public:
        void pop(int val)
        {
            if(!q.empty()&&val==q.front())
            {
                q.pop_front();
            }
        }
        void push(int val)
        {
            while(!q.empty()&&val>q.back())
            {
                q.pop_back();
            }
            q.push_back(val);
        }
        int Getfront()
        {
            return q.front();
        }
};
class Solution {
public:
    vector maxSlidingWindow(vector& nums, int k) {
        vector result;
        Myqueue q;
        for(int i=0;i

7.前K个高频元素

347. 前 K 个高频元素

使用堆和map配合,map用于统计元素个数,堆用来求TopK问题。

注意这里的堆操作。

class Solution {
public:
    class Compare
    {
        public:
        bool operator()(const pair&lhs,const pair& rhs)
        {
            return lhs.second>rhs.second;
        }
    };
    vector topKFrequent(vector& nums, int k) {
        unordered_map m; 
        for(auto& e:nums)
        {
            m[e]++;
        }
        priority_queue,vector>,Compare> heap;//建立一个小顶堆
        for(auto& e:m)
        {
            if(heap.size()heap.top().second)
            {
                heap.pop();
                heap.push(e);
            }
        }
        vector result;
        while(!heap.empty())
        {
            result.push_back(heap.top().first);
            heap.pop();
        }
        return result;
    }
};

{
heap.push(e);
}
else if(e.second>heap.top().second)
{
heap.pop();
heap.push(e);
}
}
vector result;
while(!heap.empty())
{
result.push_back(heap.top().first);
heap.pop();
}
return result;
}
};


  • 相关阅读:
    Fashion MNIST与分类算法
    安全中级-初开始
    vs2019打包其他工具生成的可执行文件
    element UI table横向树结合checkbox进行多选,实现各个节点的[全选,半选,不选]状态附带模拟数据
    C# 核心8——多态
    操作系统的结构设计怎么搞?带你理解理解
    聊聊性能测试环境搭建
    10分钟极速入门dash应用开发
    Spring Cloud Alibaba+saas企业架构技术选型+架构全景业务图 + 架构典型部署方案
    如何选择功放芯片?音质好的功放芯片性能详解
  • 原文地址:https://blog.csdn.net/qq_51492202/article/details/128145634