首页 > 编程语言 >算法训练(leetcode)第九天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

算法训练(leetcode)第九天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

时间:2024-06-15 17:32:55浏览次数:13  
标签:第九天 20 队列 pop st int push qu empty

刷题记录

232. 用栈实现队列

leetcode题目地址

考察栈与队列之间的特性。
栈:后进先出(先进后出)——FILO。
队列:先进先出——FIFO。

所以使用两个栈模拟队列,分别为in和out。当入队新元素时将其压入in栈。当需要对队头元素操作时(peek/pop),从out栈中取栈顶元素。当out栈为空时,则将in栈中的元素全部存入out栈。

时间复杂度: push: O ( 1 ) O(1) O(1);pop: O ( n ) O(n) O(n);peek: O ( n ) O(n) O(n);empty: O ( 1 ) O(1) O(1);
空间复杂度: O ( n ) O(n) O(n)

// c++
class MyQueue {
public:
    stack<int> in;
    stack<int> out;
    MyQueue() {

    }
    
    void push(int x) {
        in.push(x);
    }
    
    int pop() {
        if(out.empty()){
            while(!in.empty()){
                out.push(in.top());
                in.pop();
            }
        }
        int res = out.top();
        out.pop();
        return res;
    }
    
    int peek() {
        int res = pop();
        out.push(res);
        return res;
    }
    
    bool empty() {
        return in.empty() && out.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. 用队列实现栈

leetcode题目地址

同上题类似。

使用两个队列模拟栈,分别为qu和tmp。入栈新元素压入qu,当需要操作栈顶元素时,获取qu的长度size,将qu中的前size-1个元素挪入tmp,剩余一个元素即为栈顶元素,操作结束过后再将tmp中的元素挪回qu。

时间复杂度: push: O ( 1 ) O(1) O(1);pop: O ( n ) O(n) O(n);peek: O ( 1 ) O(1) O(1);empty: O ( 1 ) O(1) O(1);
空间复杂度: O ( n ) O(n) O(n)

// c++
class MyStack {
public:
    queue<int> qu;
    queue<int> tmp;

    MyStack() {

    }
    
    void push(int x) {
        qu.push(x);
    }
    
    int pop() {
        int len = qu.size();
        while(len > 1){
            tmp.push(qu.front());
            qu.pop();
            len--;
        }
        int res = qu.front();
        qu.pop();
        while(!tmp.empty()){
            qu.push(tmp.front());
            tmp.pop();
        }
        return res;

    }
    
    int top() {
        return qu.back();
    }
    
    bool empty() {
        return qu.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. 有效的括号

leetcode题目地址

左括号压入栈,右括号与栈顶元素进行匹配,若匹配成功,弹出栈顶元素,反之返回pop。

一些小细节需要处理:

  • 当前面没有左括号或者左括号都匹配完毕(栈为空),此时输入一个右括号进行匹配直接取栈顶元素会出异常。需要返回false。
  • 当输入字符串中只有左括号没有右括号或左括号未完全匹配时,遍历结束后栈中会剩余未匹配的左括号。需要返回false。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

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

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

leetcode题目地址

题目描述类似于祖玛游戏,相邻元素相同则删除。遍历字符串,借助栈来存储前面访问过的元素,若栈顶元素也就是前一个访问的元素与当前元素相同,遍历的指针后移,栈顶元素弹出。反之则将元素压入栈中。

Tips: 字符串也可用作栈,入栈push_back(),出栈pop_back()。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        for(int i=0; i<s.size(); i++){
            if(!st.empty() && st.top()==s[i]) st.pop();
            else st.push(s[i]);
        }
        int i=st.size();
        s.resize(i);
        while(i--){
            s[i] = st.top();
            st.pop();
        }
        return s;
    }
};

标签:第九天,20,队列,pop,st,int,push,qu,empty
From: https://blog.csdn.net/weixin_43872997/article/details/139703804

相关文章

  • 持续总结中!2024年面试必问 20 道并发编程面试题(七)
    上一篇地址:持续总结中!2024年面试必问20道并发编程面试题(六)-CSDN博客十三、请解释什么是生产者-消费者问题。生产者-消费者问题(Producer-ConsumerProblem)是计算机科学和操作系统中的一个经典同步问题。这个问题描述了两种不同的进程或线程:生产者(Producer)和消费者(Consumer),它......
  • 持续总结中!2024年面试必问 20 道并发编程面试题(八)
    上一篇地址:持续总结中!2024年面试必问20道并发编程面试题(七)-CSDN博客十五、请解释什么是阻塞队列(BlockingQueue)。阻塞队列(BlockingQueue)是一种特殊的队列,它是Java并发集合的一部分,用于在多线程环境中进行线程间通信。当生产者线程(Producer)尝试将元素放入队列时,如果队列已......
  • 【2024.06.15】35mm定焦构图练习
    图源都为午饭饭,可以在B站搜索到,侵删50期日光充足、裙、小清新、城镇、伞......
  • 整理好了!2024年最常见 20 道并发编程面试题(七)
    上一篇地址:整理好了!2024年最常见20道并发编程面试题(六)-CSDN博客十三、请描述什么是生产者-消费者问题以及如何解决它。生产者-消费者问题,也称为有限缓冲问题,是计算机科学和操作系统中的一个经典同步问题。这个问题描述了两个进程组:生产者(Producer)和消费者(Consumer),它们共享......
  • 2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一
    2024-06-15:用go语言,Alice和Bob在一个环形草地上玩一个回合制游戏。草地上分布着一些鲜花,其中Alice到Bob之间顺时针方向有x朵鲜花,逆时针方向有y朵鲜花。游戏规则如下:1.游戏从Alice开始。2.每个回合中,当前玩家必须选择顺时针或逆时针,并在所选方向上摘取一朵鲜花。......
  • 2024中育云备份下载专用网址
    说明Introduction如在使用过程中有任何问题,请及时与我取得联系。由于本人写的所有下载器都挂在ezy服务器上,所以说会涉及跨域访问当出现登录问题时,请确保,网址栏中应为http://...,而不是https://...在线专栏登录器http://ezy-sxz.oss-cn-hangzhou.aliyuncs.com/zxzllogin.htm......
  • 17岁中专女生勇夺2024阿里全球数学赛12名好成绩,今天,站在程序员的视角,我们来聊聊数学对
    大家好,我是程序员陶朱公,一个认真生活,总想超越自己的程序员。前言相信这两天,大家都刷屏到了一个比较热度的新闻——17岁中专女生在今年这届阿里举办的全球数赛中,勇夺第12名的好成绩。↓↓↓看到这里,可能有小伙伴会觉得有点疑惑:又不是第一名,不明白第12名的她,为什么会引起社会......
  • 【Linux】生产者消费者模型——阻塞队列BlockQueue
    >作者:დ旧言~>座右铭:松树千年终是朽,槿花一日自为荣。>目标:理解【Linux】生产者消费者模型——阻塞队列BlockQueue。>毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!>专栏选自:Linux初阶>望小伙伴们点赞......
  • 单调队列优化 dp
    单调队列优化dp适用条件只关注“状态变量”“决策变量”及其所在的维度,如果转移方程形如:\[f[i]=\min_{L(i)≤j≤R(i)}^{}{\{f[j]+cost(i,j)\}}\]则可以使用单调队列优化。具体的,把\(cost(i,j)\)分成两部分,第一部分仅与\(i\)有关,第二部分仅与\(j\)有关。对于每个\(i\)......
  • 2024年,计算机相关专业还值得选择吗?
    随着2024年高考的结束,数百万高三毕业生将迎来人生中的一个重要转折点——选择大学专业。计算机科学与技术、人工智能、网络安全、软件工程等专业,长期以来一直是热门选择。但在行业竞争加剧和市场饱和度提高的今天,这些专业是否仍具有强大的发展潜力和良好的就业前景呢?作为高......