【数据结构】栈和队列常见题目

文章目录

  • 有效的括号
  • 用队列实现栈
    • 两个队列实现栈
    • 一个队列实现栈
  • 用栈实现队列
  • 设计循环队列
  • 最小栈
  • 栈的压入&弹出序列
  • 逆波兰表达式

队列:先进先出 栈:后进先出

有效的括号

https://leetcode.cn/problems/valid-parentheses/

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        //遍历字符串,碰到左括号:进栈   碰到右括号:出栈顶元素判断是否和该右括号匹配
        for(auto& ch:s)
        {
            if(ch == '(' || ch == '[' || ch == '{') 
            {
                st.push(ch);
            }
            else 
            {
                //如果栈为空,说明括号是不匹配的
                if(st.empty()) return false;
                //出栈顶元素和当前右括号匹配
                char top = st.top();
                st.pop();
                if( ch ==')' && top != '('  || ch == ']' && top != '[' ||ch == '}' && top != '{')
                    return false; 
            }
        }
        return st.empty(); //如果最后栈为空,说明括号是匹配的
    }
};

用队列实现栈

https://leetcode-cn.com/problems/implement-stack-using-queues/

image-20230818161844459

两个队列实现栈

class MyStack {
public:
    MyStack() {

    }
    
    void push(int x) {
        NonEmptyQueue.push(x);//往不为空的队列插入数据
    }
    
    int pop() {
        //将不空队列的数据放到空队列当中,直到不空队列只有一个元素
        while(NonEmptyQueue.size() > 1)
        {
            EmptyQueue.push(NonEmptyQueue.front());
            NonEmptyQueue.pop();
        }
        int front = NonEmptyQueue.front();
        NonEmptyQueue.pop();
        NonEmptyQueue.swap(EmptyQueue);//交换两个队列,保证EmptyQueue为空队列
        return front;
    }
    
    int top() {
        return NonEmptyQueue.back();
    }
    
    bool empty() {
        return EmptyQueue.empty() && NonEmptyQueue.empty();
    }
private:
    queue<int> NonEmptyQueue;//不为空的队列
    queue<int> EmptyQueue;//空队列
};

一个队列实现栈

class MyStack {
public:
    MyStack() {

    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int size = q.size();
        //将前size-1个元素重新插入到队列当中
        for(int i = 0;i<size-1;i++)
        {
            int front = q.front();
            q.pop();
            q.push(front);
        }
        //此时队头元素就相当于是栈顶元素
        int front = q.front();
        q.pop();
        return front;
    }
    
    int top() {
        return q.back();
    }
    
    bool empty() {
        return q.empty();
    }
private:
    queue<int> q;
};

用栈实现队列

https://leetcode-cn.com/problems/implement-queue-using-stacks/

class MyQueue {
public:
    MyQueue() {

    }
    
    void push(int x) {
        pushStack.push(x);
    }
    void Check() //检查是否要将push栈的内容导入到pop栈
    {
        if(popStack.empty())
        {
            while(!pushStack.empty())
            {
                popStack.push(pushStack.top());
                pushStack.pop();
            }
        }
    }
    int pop() {
        Check();
        int top = popStack.top();
        popStack.pop();
        return top;
    }
    
    int peek() {
        Check();
        return popStack.top();
    }
    
    bool empty() {
        return pushStack.empty() && popStack.empty();
    }
private:
    stack<int> pushStack;//存放数据的栈
    stack<int> popStack;//用于弹出数据的栈
};

设计循环队列

https://leetcode-cn.com/problems/design-circular-queue/

方式1:使用数组实现

class MyCircularQueue {
public:
    MyCircularQueue(int k) {
        arr.resize(k+1);//开辟k+1个空间
        front = tail = 0;
        size = k;
    }
    
    bool enQueue(int value) {  //向循环队列插入一个元素。如果成功插入则返回真
        if(isFull()) return false;
        arr[tail] = value;
        tail ++;
        tail %= size+1; //tail = tail % (size+1)
        return true;
    }
    
    bool deQueue() { //从循环队列中删除一个元素。如果成功删除则返回真。
        if(isEmpty()) return false;
        front++;
        front %= size+1;
        return true;
    }
    
    int Front() {
        if(isEmpty()) return -1;
        return arr[front];
    }
    
    int Rear() {
        if(isEmpty()) return -1;
        //由于插入元素之后,tail往后走,所以tail的前一个元素才是队尾元素
        if(tail == 0) return arr[size];
        else return arr[tail-1];
    }
    
    bool isEmpty() {
        return front == tail;
    }
    
    bool isFull() {
        return (tail + 1) % (size+1) == front;
    }
private:
    vector<int> arr;
    int front;//标志队头
    int tail;//标志队尾
    int size;//实际存储的元素个数
};

方法2:链表实现

class MyCircularQueue {
public:
    MyCircularQueue(int k) {
        //构建k+1个节点的循环链表
        tail = head = new ListNode;
        for(int i = 0;i<k;i++) 
        {
            ListNode* newnode = new ListNode;
            tail->next = newnode;
            tail = tail->next;
        }
        //tail指向尾节点,让首尾相连
        tail->next = head;

        //注意:要让tail回到起始位置!!!!!因为一开始链表没有有效元素
        head = tail;
    }
    
    bool enQueue(int value) { //向循环队列插入一个元素。如果成功插入则返回真。
        if(isFull()) return false;
        tail->val = value;
        tail = tail->next;
        return true;
    }
    
    bool deQueue() {
        if(isEmpty()) return false;
        head = head->next;
        return true;
    }
    
    int Front() {
        if(isEmpty()) return -1;
        return head->val;
    }
    
    int Rear() {
        if(isEmpty()) return -1;
        //从head位置遍历查找,tail的前一个节点放的就算队尾元素
        ListNode* cur = head;
        while(cur->next != tail)
            cur = cur->next;
        return cur->val;
    }
    
    bool isEmpty() {
        return head == tail;
    }
    
    bool isFull() {
        return tail->next == head;
    }
private:
    ListNode* head;
    ListNode* tail;
};s

最小栈

https://leetcode.cn/problems/min-stack/

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        dataStack.push(val);
        //判断要往辅助栈放重复元素还是更小的元素
        if( minStack.empty() || minStack.top() >= val)
            minStack.push(val);
        else 
            minStack.push(minStack.top());//重复压入当前最小栈栈顶元素
    }
    
    void pop() {
        int top = dataStack.top();
        dataStack.pop();
        minStack.pop(); //坑点!!此时minStack也要同步pop数据
    }
    
    int top() {
        return dataStack.top();
    }
    
    int getMin() {
        return minStack.top();
    }
private:
    stack<int> minStack;//辅助栈->存放当前栈中对应的最小值
    stack<int> dataStack;
};

优化:

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        dataStack.push(val);
        if( minStack.empty() || minStack.top() >= val)
            minStack.push(val);
    }
    
    void pop() {
        int top = dataStack.top();
        dataStack.pop();
        if(top == minStack.top())
            minStack.pop(); 
    }
    
    int top() {
        return dataStack.top();
    }
    
    int getMin() {
        return minStack.top();
    }
private:
    stack<int> minStack;//辅助栈->存放当前栈中对应的最小值
    stack<int> dataStack;
};

栈的压入&弹出序列

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

逆波兰表达式

https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/79755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux —— 进程间通信

目录 一&#xff0c;进程间通信 二&#xff0c;管道 匿名管道 命名管道 一&#xff0c;进程间通信 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;&#xff0c;即在不同进程之间进行信息的传播或交换&#xff1b;由于一般进程用户地址空间是…

高效使用ChatGPT之ChatGPT客户端

ChatGPT客户端&#xff0c;支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac&#xff1a; 说明 chatgpt桌面版&#xff0c;相比于网页版的chatgpt&#xff0c;最大的特色是支持历史聊天对话记录导出&#xff0c;且支持三种格式&#xff1a;PNG、PDF、…

如何使用 ChatGPT 将文本转换为 PowerPoint 演示文稿

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 步骤 1&#xff1a;将文本转换为幻灯片演示文稿 第一步涉及指示 ChatGPT 根据给定的文本生成具有特定数量幻灯片的演示文稿。首先&#xff0c;您必须向 ChatGPT 提供要转换的文本。 使用以下提示指示…

控制方法笔记

基于模型的控制&#xff1a;LQR&#xff0c;模型建立如果不准确&#xff0c;会给控制带来不确定性。 运动学和动力学&#xff1f; 大货车很多参数不了解的话&#xff0c;有时候不如用运动学。所以说&#xff0c;建模不精准不如用运动学。 LQR 模型是状态空间线性的。目标函…

Harvard transformer NLP 模型 openNMT 简介入门

项目网址&#xff1a; OpenNMT - Open-Source Neural Machine Translation logo&#xff1a; 一&#xff0c;从应用的层面先跑通 Harvard transformer GitHub - harvardnlp/annotated-transformer: An annotated implementation of the Transformer paper. ​git clone https…

【脚踢数据结构】查找

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

JDBC配置文件抽取-spring11

改成context,到这里我们context命名空间就引入完毕&#xff0c;加载我们外部properties配置文件&#xff1a; 用它&#xff1a;第一个属性&#xff0c;第二个类型 在未加载路径下&#xff1a; 现在我已经把spring加载到配置文件里了。 现在我需要在这个位置引入proper…

04 qt功能类、对话框类和文件操作

一 QT中时间和日期 时间 ---- QTime日期 ---- QDate对于Qt而言,在实际的开发过程中, 1)开发者可能知道所要使用的类 ---- >帮助手册 —>索引 -->直接输入类名进行查找 2)开发者可能不知道所要使用的类,只知道开发需求文档 ----> 帮助 手册,按下图操作: 1 …

人类反馈强化学习RLHF;微软应用商店推出AI摘要功能

&#x1f989; AI新闻 &#x1f680; 微软应用商店推出AI摘要功能&#xff0c;快速总结用户对App的评价 摘要&#xff1a;微软应用商店正式推出了AI摘要功能&#xff0c;该功能能够将数千条在线评论总结成一段精练的文字&#xff0c;为用户选择和下载新应用和游戏提供参考。该…

小程序中display:flex和v-show,v-show不生效,uni-app

小程序中display:flex和v-show&#xff0c;v-show不生效、、 解决方案&#xff1a; display&#xff1a;flex样式的优先级高于了v-show &#xff0c;v-show其实就是display&#xff1a;none&#xff0c;display&#xff1a;flex优先级高于display&#xff1a;none。 使用 :s…

opencv 矩阵运算

1.矩阵乘&#xff08;*&#xff09; Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩阵乘 结果 2.元素乘法或者除法&#xff08;mul&#xff09; Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…

(stm32)低功耗模式

低功耗模式 执行哪个低功耗模式的程序判断流程 标志位设置操作一定要在WFI/WFE之前&#xff0c;调用此指令后立即进入睡眠判断流程 模式对比 睡眠模式 停止模式 待机模式

中间件的介绍

1.1 什么是中间件 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;他使用系统软件所提供的基础服务&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的。 例如MySQL就可以看作是具备中间件特性的一种技术&#x…

centos下使用jemalloc解决Mysql内存泄漏问题

参考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的内存分配管理 &#xff08;2&#xff09;tcmalloc…

Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

文章目录 一、企业镜像源1、阿里云2、网易1633、搜狐镜像4、华为 二&#xff1a;高校镜像源1、清华源2、北京大学3、中国科学技术大学源 &#xff08;USTC&#xff09;4、 上海交通大学5、山东大学6、 吉林大学开源镜像站7、 哈尔滨工业大学开源镜像站8、 西安交通大学软件镜像…

Android Retrofit原理浅析

官方地址:Retrofit 原理:Retrofit 本质上是代理了OKhttp,使用代理模式,Type-Safe 类型安全 编译器把类型检查出 避免类型错误, enqueue 异步 切换线程 execute 同步 不切换线程 enqueue:Call接口定义的抽象方法 Retrofit.Create() 方法首先验证接口validateServiceInterf…

RGOS日常管理操作

RGOS日常管理操作 一、前言二、RGOS平台概述2.1、锐捷设备的常用登陆方式2.2、使用Console登入2.3、Telnet远程管理2.4、SSH远程管理2.5、登陆软件&#xff1a;SecureCRT 三、CLI命令行操作3.1、CLI命令行基础3.2、CLI模式3.3、CLI模式互换3.4、命令行特性3.4.1、分屏显示3.4.2…

0基础入门C++之类和对象上篇

目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1类的两种定义方式:3.2成员变量命名规则的建议 4.类的访问限定符及封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化7.类对象模型7.1如何计算类对象的大小7.2 类对象的存储方式猜测 8.this指针8.1this指针的引出8.2…

通过请求头传数据向后端发请求

axios &#xff08;get post请求、头部参数添加&#xff09;傻瓜式入门axios_axiospost请求参数_web_blog的博客-CSDN博客

http库 之 OKHttpUtil

源码位置 方便实用&#xff0c;个人感觉不错 依赖 <dependency><groupId>io.github.admin4j</groupId><artifactId>common-http-starter</artifactId><version>0.7.5</version> </dependency>代码实践 /*** 通用http的pos…