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

文章目录

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

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

有效的括号

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/

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ、Dashboard部署以及安全设置

RocketMQ、dashboard部署以及安全设置 一、启动RocketMQ1.1 下载RocketMQ1.2 修改配置文件1.2.1 修改nameServer Jvm内存配置1.2.2 修改broker参数 1.3 启动1.3.1 启动NameServer1.3.2 启动Broker1.3.3 测试是否启动成功1.3.3.1 测试消息发送1.3.3.2 测试消息接收1.3.3.3 Java程…

前端笔试+面试分享

以下是个人线下面试遇到的真实的题&#xff0c;仅供参考和学习 1. css 选择符有哪些&#xff1f;哪些属性可以继承&#xff1f;优先级算法加何计算&#xff1f; CSS选择符有很多种&#xff0c;例如类型选择器、类选择器、ID选择器、属性选择器、伪类选择器、伪元素选择器等。 …

C语言:深度学习知识储备

目录 数据类型 每种类型的大小是多少呢&#xff1f; 变量 变量的命名&#xff1a; 变量的分类&#xff1a; 变量的作用域和生命周期 作用域&#xff1a; 生命周期&#xff1a; 常量 字符串转义字符注释 字符串&#xff1a; 转义字符 操作符&#xff1a; 算术操作符…

js fetch请求中断的几种方式

1、通过AbortController 这是官方标准手段&#xff0c;真正意义的阻止请求&#xff08;不支持ie&#xff09; 后端接口设置的两秒返回数据 function myFetch() {const controller new AbortController();const signal controller.signal;fetch(http://localhost:3000/aaa/…

【JVM】对String::intern()方法深入详解(JDK7及以上)

文章目录 1、什么是intern&#xff1f;2、经典例题解释例1例2例3 1、什么是intern&#xff1f; String::intern()是一个本地方法&#xff0c;它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串&#xff0c;则返回代表池中这个字符串的String对象的引用&#…

分布式唯一ID实战

目录 一、UUID二、数据库方式1、数据库生成之简单方式2、数据库生成 - 多台机器和设置步长&#xff0c;解决性能问题3、Leaf-segment 方案实现4、双 buffer 优化5、Leaf高可用容灾 三、基于Redis实现分布式ID四、雪花算法1、雪花算法介绍2、 雪花算法生产环境架构&#xff1a;3…

【FAQ】调用视频汇聚平台EasyCVR的iframe地址,视频无法播放的原因排查

有用户反馈&#xff0c;在调用iframe地址后嵌入用户自己的前端页面&#xff0c;视频无法播放并且要求登录。 安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、视频云存储、视频集中…

【校招VIP】测试方案之测试用例分析

考点介绍 测试用例是测试岗面试和工作后的核心&#xff0c;在面试里对测试用例的分析是高频考查点。但是很多同学因为没有真实的商业产品需求&#xff0c;只能简单的看别人的用例学习&#xff0c;导致面试时被一个陌生问题卡住。 比如最简单的用户名密码输入&#xff0c;在商业…

元宇宙时代超高清视音频技术白皮书关于流媒体协议和媒体传输解读

流媒体协议 元宇宙业务场景对流媒体传输的实时性和互动性提出了更高的要求&#xff0c;这就需要在传统的 RTMP、SRT、 HLS 等基础上增加实时互动的支持。实时互动&#xff0c;指在远程条件下沟通、协作&#xff0c;可随时随地接入、实时地传递虚实融合的多维信息&#xff0c;身…

Blender增强现实3D模型制作指南【AR】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 将静态和动画 3D 内容集成到移动增强现实 (AR) 体验中是增强用户沉浸感和参与度的高效方法。 然而&#xff0c;为 AR 创建 3D 对象可能相当艰巨&#xff0c;尤其是对于那些缺乏 3D 建模经验的人来说。 与添加视频或照片 AR…

python3 0基础学习----数据结构(基础+练习)

python 0基础学习笔记之数据结构 &#x1f4da; 几种常见数据结构列表 &#xff08;List&#xff09;1. 定义2. 实例&#xff1a;3. 列表中常用方法.append(要添加内容) 向列表末尾添加数据.extend(列表) 将可迭代对象逐个添加到列表中.insert(索引&#xff0c;插入内容) 向指定…

从零实战SLAM-第八课(非特征点的视觉里程计)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…