文章目录

  • 01 用两个栈模拟一个队列
  • 02 包含min函数的栈
  • 03 栈的压入、弹出序列
  • 队列的最大值

01 用两个栈模拟一个队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
栈是先进后出,队列是先进先出
用两个栈来模拟队列的核心思想就是一个栈作为入栈,一个作为出栈,将入栈内的数据先倒出到出栈中,这样一个反复就可以做到先进先出。

class CQueue {stack<int> stack_in;stack<int> stack_out;
public:CQueue() {while(!stack_in.empty()){stack_in.pop(); //清空进栈}while(!stack_out.empty()){stack_out.pop();//清空入栈}}void appendTail(int value) {stack_in.push(value); //在进栈中直接插入元素} int deleteHead() {if(stack_out.empty()) //如果出栈是空,从进栈中加入元素{if(stack_in.empty()) //如果进栈也是空表明栈内没有元素 返回-1{return -1;}while(!stack_in.empty()) //如果进栈不为空,将进栈中的元素都加入出栈中{stack_out.push(stack_in.top());stack_in.pop();}int out = stack_out.top();stack_out.pop();return out;}else{int out = stack_out.top();stack_out.pop();return out;}}
};

02 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
解题思路
方法一:建立两个栈,一个栈负责正常的push,pop,另外一个栈负责存储非严格递减的输入数据
当正常栈pop出的元素等于非非严格递减栈的栈顶元素时,非严格递减栈也pop栈顶元素

class MinStack {private:stack<int> stkNormal;stack<int> stkMin;
public://方法一:建立两个栈,一个栈负责正常的push,pop,另外一个栈负责存储非严格递减的输入数据// 当正常栈pop出的元素等于非非严格递减栈的栈顶元素时,非严格递减栈也pop栈顶元素/** initialize your data structure here. */MinStack() {}//加入新元素的时候判断是否是最小元素void push(int x) {if(stkMin.empty()){stkMin.push(x);stkNormal.push(x);}else{if(x <= stkMin.top()){stkMin.push(x);}stkNormal.push(x);}}// pop的时候看看是不是最小元素void pop() {if(stkNormal.top() == stkMin.top()){stkNormal.pop();stkMin.pop();}else{stkNormal.pop();}}int top() {return stkNormal.top();}int min() {return  stkMin.top();}
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->min();*/

03 栈的压入、弹出序列


解题思路用一个栈来模拟进栈操作

class Solution {public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {if (popped.size() == 0){return true;}stack<int> pushStack;pushStack.push(pushed[0]);int j = 0;for (int i = 0; i < popped.size(); i++){while (pushStack.top() != popped[i]){j++;//超出边界等于失败if (j >= pushed.size()){return false;}pushStack.push(pushed[j]);}//栈为空表示失败if (pushStack.empty()){return false;}pushStack.pop();//栈为空补充元素if (pushStack.empty() & (i < popped.size()-1)){j++;//超出边界等于失败if (j >= pushed.size()){return false;}pushStack.push(pushed[j]);}}return true;}
};

队列的最大值


解题思路 用空间换时间

class MaxQueue {private:queue<int> myQue;deque<int> recordMax;
public:MaxQueue() {}int max_value() {if (recordMax.empty())return -1;return recordMax.front();}void push_back(int value) {myQue.push(value);while ((!recordMax.empty()) && (value > recordMax.back())){recordMax.pop_back();}recordMax.push_back(value);}int pop_front() {if (myQue.empty()) return -1;if (myQue.front() == recordMax.front()){recordMax.pop_front();}int temp = myQue.front();myQue.pop();return temp;}
};

leetcode刷题集:栈与队列相关推荐

  1. 【LeetCode刷题】栈与队列专题

    前言:之前对栈与队列一直停留在表层概念的理解上,不知道怎么用,借刷题的机会来深入理解一下. 文章目录 20 有效括号 1047. 删除字符串中的所有相邻重复项 栈版本 双指针版本 150. 逆波兰表达 ...

  2. 【LeetCode】分类刷题 之 栈和队列

    STL 栈:std::stack<int> S; S.top() S.empty() S.push(x) S.pop() S.size() 队列:std:queue<int> ...

  3. Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)

    ** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...

  4. Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)

    Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...

  5. LeetCode刷题 --杂篇 --数组,链表,栈,队列

    武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...

  6. Leetcode刷题——栈与队列

    Leetcode刷题--栈与队列 一.栈与队列定义 二.Leetcode题目 1.用栈实现队列 2.用队列实现栈 一.栈与队列定义 栈:先进后出,栈提供push 和 pop 等等接口,所有元素必须符合 ...

  7. C#LeetCode刷题-栈

    栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水 35.6% 困难 71 简化路 ...

  8. Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)

    ** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...

  9. Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言)

    Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言) ** 题目: ** 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2 ...

最新文章

  1. 通过修改Tomcat配置,解决乱码问题
  2. macOS下编译PgBouncer
  3. Wave 文件(5): 获取 Wave 文件的格式信息
  4. djl和ljl_使用Spring Boot和DJL进行深度学习
  5. [vue-cli]vue-cli怎么解决跨域的问题?
  6. uart口图片_uart 加强了的串口调试助手,可以自动记录传输数据,并且显示图片,示波器等功能 Com Port 编程 267万源代码下载- www.pudn.com...
  7. eclipse 字体设置 Courier New字
  8. Linux:为什么那么多人讨厌systemd?
  9. java 字符串索引从0开始_无限字符串中的字符串的第一个索引-Java
  10. 【Luogu2393】yyy loves Maths II(浮点输入输出)
  11. mybatis结果的组装(springboot)
  12. dom4j 解析xml文件demo
  13. 基于单片机的水库控制系统设计
  14. 黑马前端基础-HTML-SE
  15. sublime 3 自定义配置
  16. CGAL Arrangements and Their Applications: A Step-By-Step Guide
  17. 窗体泄漏错误has leaked window android.widget
  18. 福州师范大学计算机专业导师简介,黄欣沂_福建师范大学研究生导师信息
  19. 分别使用正则表达式的子模式编号和子模式命名两种方法匹配ABAC、AABB、ABAB式成语
  20. 【SAP】ABAP——币种金额转换

热门文章

  1. awk的sub函数和gsub函数的用法
  2. 30美丽的矢量建筑艺术为灵感
  3. 优秀项目经理必备的8个要素
  4. JS中代表结束的三个关键字 break,continue,return
  5. 模拟3个人排除买票,每人买1张票。售货员只有1张五元的钱,电影票5元一张
  6. c++基础day03
  7. Linux安装或升级openssh步骤和可能遇到的问题
  8. 解决Chrome调用IE弹出cmd黑窗口的问题
  9. RPNet++:人脸对齐faceAlignment和基于CNN的三维人脸恢复
  10. 终端报错xcrun: error: unable to find utility “xcodebuild”, not a developer tool or