当前位置: 首页 > article >正文

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

day10

1. 232用栈实现队列

class MyQueue {
public:
    stack<int> stIn;
    stack<int> stOut;
    // push(x) -- 将一个元素放入队列的尾部。
    // pop() -- 从队列首部移除元素。
    // peek() -- 返回队列首部的元素。
    // empty() -- 返回队列是否为空。
    MyQueue() {
        
    }
    
    void push(int x) {
        stIn.push(x);
    }
    
    int pop() {
        // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
        if (stOut.empty()) {
            // 从stIn导入数据直到stIn为空
            while(!stIn.empty()) {
                stOut.push(stIn.top());
                //top() 返回栈顶元素的引用,但不移除该元素。可以用来查看栈顶元素的值。
                //pop() 从栈中移除栈顶元素,但不返回该元素的值。如果想使用或存储栈顶元素的值,需要在 pop() 之前调用 top()。
                stIn.pop();
            }
        }
        int result = stOut.top();
        stOut.pop();
        return result;
    }
    
    int peek() {
        int res = this->pop(); // 直接使用已有的pop函数
        stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
        return res;
    }
    
    bool empty() {
        return stIn.empty() && stOut.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();
 */

2. 225用队列实现栈

class MyStack {
public:
    //这道题目用一个队列就够了。一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
    queue<int> que;
    MyStack() {
        
    }
    
    void push(int x) {// 将元素 x 压入栈顶。
        que.push(x);
    }
    
    int pop() {
        // 记录队列的大小
        int size = que.size();
        size--; // 需要移除栈顶元素,而将其他元素重新添加到队列尾部
        
        // 循环将队列前面的元素(除最后一个以外)重新添加到队列尾部
        while (size--) {
            que.push(que.front()); // 将队列头部的元素添加到队尾
            que.pop(); // 移除原队列头部的元素
        }
        
        // 现在队列中的最后一个元素是原栈的栈顶元素
        int result = que.front(); // 获取当前队列头部的元素,它是“栈顶元素”
        que.pop(); // 将该元素移除
        
        return result; // 返回栈顶元素的值
    }

    
    int top() {
        int size = que.size();  // 记录队列的当前大小
        size--; // 栈顶元素是最后进入队列的元素,因此我们把前 size-1 个元素移到队列尾部

        // 将前面的元素(除了最后一个元素外)移动到队列的尾部
        while (size--) {
            que.push(que.front());  // 将队列前端的元素添加到队列末尾
            que.pop();               // 移除队列前端的元素
        }

        // 此时,队列头部元素就是栈顶元素
        int result = que.front();   // 获得“栈顶”元素的值

        que.push(que.front());      // 为了保持队列的顺序,将该元素重新加入到队列末尾
        que.pop();                  // 移除队列头部的元素

        return result;              // 返回该“栈顶”元素的值
    }

    
    bool empty() {//如果栈是空的,返回 true ;否则,返回 false 。
        return que.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();
 */

3. 20有效的括号

思路:

  1. 如果字符串长度为奇数,直接返回 false,因为成对的括号总会构成偶数长度的字符串。
  2. 遇到左括号时,将其压入栈中。
  3. 遇到右括号时,检查栈顶是否为对应的左括号;若匹配,弹出栈顶继续;不匹配则返回 false
  4. 循环结束后,如果栈为空,返回 true;否则返回 false
class Solution {
public:
    bool isValid(string s) {
        stack<int> s1;
        if(s.size()%2!=0){
            return false;
        }
        for(int i=0;i<s.size();i++){
            if(s[i]=='('||s[i]=='['||s[i]=='{'){
                s1.push(s[i]);
            }
            if(s[i]==')'||s[i]==']'||s[i]=='}'){
                if(s1.empty()){
                    return false;
                }
                int result=s1.top();
                if(s[i]==')'){
                    if(result!='('){
                        return false;
                    }
                    else{
                        s1.pop();
                    }
                }
                if(s[i]==']'){
                    if(result!='['){
                        return false;
                    }
                    else{
                        s1.pop();
                    }
                }
                if(s[i]=='}'){
                    if(result!='{'){
                        return false;
                    }
                    else{
                        s1.pop();
                    }
                }
            }
        }
        if(s1.empty()){
            return true;
        }
        else{
            return false;
        }
    }
};

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

思路:

  1. s1:用来存储字符,帮助判断和移除相邻的重复字符。

  2. 遍历 s,遇到重复字符时从栈中移除,确保栈中无相邻重复字符。

  3. 将栈中的字符加入 s2(顺序是反的),然后将 s2 反转。

  4. 返回结果字符串 s2

class Solution {
public:
    string removeDuplicates(string s) {
        stack<int> s1;
        string s2;
        for(int i=0;i<s.size();i++){
            if(s1.empty()){
                s1.push(s[i]);
            }
            else{
                int result=s1.top();
                if(s[i]==result){
                    s1.pop();
                }
                else{
                    s1.push(s[i]);
                }
            }
        }
        while(!s1.empty()){
            int j=s1.top();
            s2.push_back(j);
            s1.pop();
        }
        int l=0,r=s2.size()-1;
        while(l<r){
            swap(s2[l++],s2[r--]);
        }
        return s2;
    }
};

http://www.kler.cn/news/367999.html

相关文章:

  • 架构师备考-数据库设计、实施和维护
  • 计算机网络:网络层 —— IPv4 地址的应用规划
  • 探索 Python 幽默之源:pyjokes 库全解析
  • redis缓存和业务应用了解
  • ubuntu GLEW could not be initialized : Unknown error
  • 校园表白墙源码修复版
  • 部署前后端分离若依项目--CentOS7宝塔版
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (八):API说明(暂时完结,后续考虑将在线版mongoDB变为本地版)
  • 多线程——Thread 类的基本用法
  • 安灯系统助力汽车零部件工厂快速解决生产异常
  • python 深度学习 项目调试 图像分割 detectron2
  • 32位的ARMlinux的4字节变量原子访问问题
  • sv标准研读第十九章-功能覆盖率
  • konva不透明度,查找,显示,隐藏
  • ThreadPoolExecutor可以创建哪是哪三种线程池呢?
  • linux网络编程4——WebSocket协议及服务器的简易实现
  • 苏州金龙技术创新赋能旅游新质生产力
  • Navicat导入Excel数据时数据被截断问题分析与解决方案
  • 论文阅读与写作入门
  • mit6824-03-GFS论文记录
  • 微信小程序版本更新管理——实现自动更新
  • Linux复习-C++
  • vue3组件通信--props
  • 虚拟现实新纪元:VR/AR技术将如何改变娱乐与教育
  • 桥接模式,外界与主机通,与虚拟机不通
  • 提示词高级阶段学习day3.3如何写好结构化 Prompt ?