首页 > 编程语言 >代码随想录算法训练营第十天| 232.用栈实现队列 、 225. 用队列实现栈 、20. 有效的括号、 1047. 删除字符串中的所有相邻重复项

代码随想录算法训练营第十天| 232.用栈实现队列 、 225. 用队列实现栈 、20. 有效的括号、 1047. 删除字符串中的所有相邻重复项

时间:2024-09-06 11:52:11浏览次数:17  
标签:第十天 队列 随想录 pop st int result push empty

学习文章链接:代码随想录

文章目录


一、 232.用栈实现队列

题目链接: 232.用栈实现队列
栈的操作:

stack<int> s;
s.empty();         //如果栈为空则返回true, 否则返回false;
s.size();          //返回栈中元素的个数
s.top();           //返回栈顶元素, 但不删除该元素
s.pop();           //弹出栈顶元素, 但不返回其值
s.push();          //将元素压入栈顶

队列的操作:

queue<int> s;
s.empty();         //如果队列为空则返回true, 否则返回false;
s.peek();           //返回队列开头元素, 但不删除该元素
s.pop();           //弹出队列开头元素, 但不返回其值
s.push();          //将元素加入队尾

方法1:

class MyQueue {
public:
    stack<int> StIn;
    stack<int> StOut;
    MyQueue() {

    }
    
    void push(int x) {
        StIn.push(x);
    }
    
    int pop() {
        while(!StIn.empty()){
            StOut.push(StIn.top());
            StOut.pop();
        }
        int result=StOut.top();
        StOut.pop();
        return result;
    }
    int peek() {
        int result=this.pop();
        StOut.push(result);
        return result;
    }
    
    bool empty() {
        return StOut.empty() && StIn.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();
 */

二、 225. 用队列实现栈

题目链接: 225. 用队列实现栈
需要注意的点: C++ 中标准库的 queue 没有 peek() 方法,而是使用 front() 方法来获取队首元素。
方法1:

class MyStack {
public:
    queue<int> q1;
    queue<int> q2;
    MyStack() {

    }
    void push(int x) {
        q1.push(x);
    }
    
    int pop() {
        while(q1.size()!=1){
            q2.push(q1.front());
            q1.pop();
        }
        int result=q1.front();
        q1.pop();
        while(!q2.empty()){
            q1.push(q2.front());
            q2.pop();
        }
        return result;
    }
    
    int top() {
        int result=this->pop();
        q1.push(result);
        return result;
    }
    
    bool empty() {
        return q1.empty()&&q2.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();
 */

三、20. 有效的括号

题目链接:20. 有效的括号
思路:使用栈的方法
需要注意的点:当遇到右括号时,在 st.top() 上的判断缺少一个条件,即在检查 st.top() 之前,应该确保栈不为空,否则会导致访问空栈的问题。
方法1:

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(int i=0;i<s.size();i++){
            if(s[i]=='(')st.push(')');
            else if(s[i]=='{')st.push('}');
            else if(s[i]=='[')st.push(']');
            else if(!st.empty() && s[i]==st.top())st.pop();
            else if(!st.empty() && s[i]!=st.top())return false;
            else if(st.empty()) return false;
        }
        if(!st.empty())return false;
        return true;
    }
};

方法2:(另一种写法)

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(int i=0;i<s.size();i++){
            if(s[i]=='(')st.push(')');
            else if(s[i]=='{')st.push('}');
            else if(s[i]=='[')st.push(']');
            else{
             if(!st.empty() && s[i]==st.top())st.pop();
            else return false;
            }
        }
        return st.empty();
    }
};

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

题目链接: 1047. 删除字符串中的所有相邻重复项
思路:使用栈的方法
需要注意的点:栈的输出是后进先出,需要反向一下。注意如何遍历栈。
方法1:

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        for(int i=0;i<s.size();i++){
            if(st.empty())st.push(s[i]);
            else{
                if(s[i]==st.top())st.pop();
                else{
                    st.push(s[i]);
                }
            }
        }
        string result="";
        while(!st.empty()){
        result+=st.top();
        st.pop();
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

标签:第十天,队列,随想录,pop,st,int,result,push,empty
From: https://blog.csdn.net/qq_44623115/article/details/140629156

相关文章

  • 代码随想录day52 || 图论3
    岛屿最大的孤岛面积packagemainimport"fmt"vardirPath=[4][2]int{{0,-1},{1,0},{0,1},{-1,0}}varvisited[][]boolvarflagboolvarresintfuncmain(){ varx,yint fmt.Scanf("%d%d",&x,&y) //x行y列初始化临界矩阵 vargra......
  • freeRTOS面试题目 面经 单片机面经汇总MCU RTOS常见面试经验汇总 freeRTOS消息队列 信
    常见rtos部分Linux题目汇总FreeRtos面经30题前后台程序与实时操作系统的区别是什么?实时系统的基本特性有哪些?什么是不可剥夺型内核?它的特点是什么?可剥夺型内核的定义及适用场景是什么?什么是可重入型函数?它有什么特点?使用可剥夺型内核时,为什么不应直接使用不可重入型函数......
  • 【代码随想录训练营第42期 Day51打卡 - 岛屿问题 - 卡码网 99. 岛屿数量 100. 岛屿的
    目录一、做题心得二、题目与题解题目一:99.岛屿数量题目链接题解1:DFS 题解2:BFS 题目二:100.岛屿的最大面积题目链接题解:DFS 三、小结一、做题心得今天打卡的是经典的岛屿问题:分别从两个方向进行探讨--深搜(DFS)与广搜(BFS)。作为这两大基本搜索最经典的例题,今天......
  • 优先级队列PriorityQueue(图文并茂)
    介绍优先级队列的作用是能保证每次取出的元素都是队列中权值最小(或最大)的。这里元素大小的评判可以通过元素本身的自然顺序(naturalordering),也可以通过构造时传入的比较器(Comparator)。Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全......
  • LeetCode刷题-队列
    一:队列的基本操作1、先进先出;入队和出队、类似与排队2、单端队列3、队列的常见操作#在python中使用deque创建队列importcollectionsimportdequeduilie=deque()#创建队列defadd(nums):duilie.append()#给队列添加元素defpeek():returnduilie[0]#查看队首......
  • 单调队列
    单调队列经典用法:维持滑动窗口滑动过程中的最大值或最小值。最大值时,单调队列从头到尾降序维持求解答案的可能性单调队列里所有对象按照规定好的单调性组织当某个对象从队尾进入单调队列时,会从队头或者队尾依次淘汰单调队列里,对后续求解答案没有帮助的对象每个对象一旦弹出......
  • C++ STL queue容器——队列
    queue容器基本概念queue是一种**先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。queue容器没有迭代器,所有元素进出都必须符合“先进先出”条件,只有顶端的元素才有机会被外界取用,所以也不提供遍历功能。queue容器常用操作构造函数queue<T>qu......
  • 代码随想录day52 || 图论搜索 岛屿数量,岛屿的最大面积
    图遍历dfs深度优先搜索bfs广度优先搜索200岛屿数量(dfs)vardirPath=[][]int{{0,-1},{1,0},{0,1},{-1,0}}//上,右,下,左varvisited[][]boolfuncnumIslands(grid[][]byte)int{ //dfs深度优先遍历,对于每一个节点,按照上下左右四个固定顺序遍历,然后到下......
  • 一个故事理解消息队列-下
    这是一篇迟到一月有余的文章。在7月18号,我用了一个故事作为案例,介绍了消息队列的基本功能和应用场景。本打算第二天介绍消息队列的主要功能特性的,由于文章排期等其他因素影响,故更新搁置了。这篇文章,接上篇《一个故事理解消息队列-上》,以Kafka为例,为大家介绍消息队列的主要功能......
  • 代码随想录算法训练营|Day07 LeetCode 344.反转字符串 ,541.反转字符串||,卡玛网54.替换
    344.反转字符串344.反转字符串-力扣(LeetCode)classSolution{public:voidreverseString(vector<char>&s){intlens=s.size();intright,left;if(lens%2!=0)//奇数个{right=lens/2+1;left=l......