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

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

时间:2024-07-01 09:56:24浏览次数:25  
标签:第十天 队列 随想录 pop int push stackout empty

今天学习了栈与队列这两个数据结构,栈是一个先进后出的结构,在C++中用stack进行表示,有push、pop、top、empty这些属性;队列是一个先进后出的结构,有push、pop、front、back。empty这些属性。在底层实现上,他们都是用deque双向队列进行实现的。

232.用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode)

想用栈实现队列,一个栈是不够的,我们需要用到两个栈来实现队列的模拟。

主要难点在于pop操作。我们设置stackin和stackout两个栈,push的元素全部放入stackin中,当需要pop操作时,我们将stackin的元素依次push入stackout,然后使用stackout进行弹出。

具体代码实现如下:

class MyQueue {
public:
stack<int> stackin;
stack<int> stackout;
    MyQueue() {

    }
    
    void push(int x) {
        stackin.push(x);
    }
    
    int pop() {
        if(stackout.empty())
        {
            while(!stackin.empty())
            {
                int result=stackin.top();
                stackin.pop();
                stackout.push(result);
            }
        }
        int result=stackout.top();
        stackout.pop();
        return result;
    }
    
    int peek() {
        int result=this->pop();
        stackout.push(result);
        return result;
    }
    
    bool empty() {
        if(stackin.empty()&&stackout.empty()) return true;
        else return false;
    }
};

/**
 * 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. 用队列实现栈 - 力扣(LeetCode)

用队列实现栈,一个队列就够了。对于pop操作,只需要把size-1个元素pop后重新push如队列中,这样位于队尾的元素就到了队首位置,直接弹出即可。
代码实现如下:

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

    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int size=q.size();
        size=size-1;
        for(int i=0;i<size;i++)
        {
            int result=q.front();
            q.pop();
            q.push(result);
        }
        int result=q.front();
            q.pop();
        return result;
    }
    
    int top() {
        return q.back();
    }
    
    bool empty() {
        if(q.empty()) return true;
        else return false;
    }
};

/**
 * 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. 有效的括号 - 力扣(LeetCode)

这个题目是去判断括号的匹配问题,一般都是用栈来解决的。括号不匹配在此题中有三种情况

1.遍历完字符串后栈内有多余的元素

2.匹配过程中发现栈顶元素和对应的数组元素不相等

3.还没遍历完字符串时,栈就为空了。

这里还有一个小技巧。例如当遍历到一个左括号时,我们直接向栈插入一个右括号。这样的好处是当栈顶元素和字符串元素进行匹配时,可以直接进行比较,比较方便。

代码实现如下:

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

    }
};

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

题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

这个题目要求删除字符串里相邻且相同的元素。也是直接用栈就可以解决,将字符串元素和栈顶元素进行匹配即可。题目比较简单,代码实现如下:
 

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> stackc;
        for(int i=0;i<s.size();i++)
        {
            if(stackc.empty()) stackc.push(s[i]);
            else
            {
                if(s[i]==stackc.top()) stackc.pop();
                else stackc.push(s[i]);
            }
        }
        string temp;
        while(!stackc.empty()) 
        {
            temp+=stackc.top();
            stackc.pop();
        }
        int start=0;
        int end=temp.size()-1;
        int mid=(end-start+1)/2-1;
        for(int i=0;i<=mid;i++) swap(temp[start+i],temp[end-i]);
        return temp;
    }
};

标签:第十天,队列,随想录,pop,int,push,stackout,empty
From: https://blog.csdn.net/m0_62154842/article/details/140092679

相关文章

  • 代码随想录算法训练营第九天|151.翻转字符串里的单词,卡码网:55.右旋转字符串
    151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)题目要求是给定一个字符串,要求把里面的单词进行倒序输出,并且要删除里面多余的空格。我的第一种做法是把里面的字符串提取出来,然后倒序放入一个新的字符串中,这样空间复杂度会比较高,也AC了,但肯定不是最......
  • 消息队列选型之 Kafka vs RabbitMQ
    在面对众多的消息队列时,我们往往会陷入选择的困境:“消息队列那么多,该怎么选啊?Kafka和RabbitMQ比较好用,用哪个更好呢?”想必大家也曾有过类似的疑问。对此本文将在接下来的内容中以Kafka和RabbitMQ为例分享消息队列选型的一些经验。一、什么是消息队列消息队列即Messag......
  • Linux进程间的通信方式(一)System V 消息队列
    文章目录前言1.消息队列概念2.消息队列的应用场景3.消息队列接口分类3.1SystemV消息队列3.2POSIX消息队列4.消息队列相关操作函数4.1ftok函数(获取一个key值)4.2msgget函数(根据key值获取一个消息队列操作符)4.3msgctl函数(设置消息队列属性)4.4msgsnd函......
  • 代码随想录算法训练营第50天 | 1143.最长公共子序列 、1035.不相交的线 、53. 最大子
    这几题都挺类似,都是求最长公共子序列,有些题目稍微变了下1143.最长公共子序列体会一下本题和718.最长重复子数组的区别视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQhttps://programmercarl.com/1143.最长公共子序列.html/***@param{string}text1*@param{......
  • 【算法专题--栈】用队列实现栈 -- 高频面试题(图文详解,小白一看就懂!!)
    目录一、前言二、题目描述三、解题方法⭐两个队列实现栈......
  • 代码随想录算法训练营第49天 | 300.最长递增子序列 、674. 最长连续递增序列 、718.
    300.最长递增子序列今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。视频讲解:https://www.bilibili.com/video/BV1ng411J7xPhttps://programmercarl.com/0300.最长上升子序列.html/***@param{number[]}nums*@return{number}*/varlengthOfL......
  • 队列的实现
    队列1.队列的概念及结构队列:只允许在一端插入数据,另一端删除数据的特殊线性表。队列是先进先出。进行插入操作的一端是队尾,删除操作的一端是队头。2.队列的实现队列也可以由数组和链表实现,但是由链表实现更好。因为如果使用数组的结构,出队列在数组头上的数据,效率会比较......
  • 03栈与队列
    栈当n个不同元素进栈时,出栈元素不同排列的个数为$$\frac{1}{n+1}C_{2n}^{n}=\frac{(2n)!}{(n+1)!n!}$$该公式为卡特兰数(Catalan)公式栈的输出序列如果输入次序是顺序输入,可以观察最先一个输出的元素,若最先输出的是最后输入的元素,则输出序列一定是倒序且唯一共享栈栈......
  • 链表实现队列
    #include<iostream>#include<stdexcept>//定义链表节点结构structNode{intdata;Node*next;};//链表队列类classLinkedListQueue{private:Node*front;//队头指针Node*rear;//队尾指针public://构造函数,初始化队头和队尾指针......
  • 代码随想录算法训练营第46天 | 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
    股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。买卖股票的最佳时机视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77qhttps://programmercarl.com/0121.买卖股票的最佳时机.html/***@param{number[]}prices*@return{number}*/varmaxProfit=......