1.设计一个有getMin功能的栈
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
要求:peek、pop、push、getMin操作的时间复杂度都是O(1),且设计的栈类型可以使用现成的栈结构
思路:建立两个栈,一个data栈作为原始栈,一个help栈为小顶栈,跟data同步压栈,如果新进栈的数比当前help栈顶元素大,则继续压入栈顶的元素,否则压入栈顶,遍历一遍即可解决
例如:
|  4  |     |  3  |
|  6  |     |  3  |
|  3  |     |  3  |
|  5  |     |  4  |
|  4  |     |  4  |
|_5_|     |_5_|
data       help

即,此时help栈顶即为data栈中的最小值,同步压栈

 public static class MyStack1{private Stack<Integer> stackData;private Stack<Integer> stackMin;public MyStack1(){this.stackData = new Stack<Integer>();this.stackMin = new Stack<Integer>();}public void push(){if(this.stackMin.isEmpty()){this.stackMin.push(newNum);}else if(newNum <= this.getmin()){this.stackMin.push(newNum);}this.stackData.push(newNum);}public int pop(){if(this.stackData.isEmpty()){throw new RuntimeException("Your stack is empty!");}int value = this.stackData.pop();if(value == this.getmin()){this.stackMin.pop();}return value;}public int geimin(){if(this.stackMin.isEmpty()){throw new RuntimeException("Your stack is empty!");}return this.stackMin.peek();}}public static class MyStack2{private Stack<Integer> stackData;private Stack<Integer> stackMin;public MyStack1(){this.stackData = new Stack<Integer>();this.stackMin = new Stack<Integer>();}public void push(){if(this.stackMin.isEmpty()){this.stackMin.push(newNum);}else if(newNum < this.getmin()){this.stackMin.push(newNum);}else{int newMin = this.stackMin.peek();this.stackMin.push(newMin);}this.stackData.push(newNum);}public int pop(){if(this.stackData.isEmpty()){throw new RuntimeException("Your stack is empty!");}this.stackMin.pop();return this.stackData.pop();}public int geimin(){if(this.stackMin.isEmpty()){throw new RuntimeException("Your stack is empty!");}return this.stackMin.peek();}} 

2.由两个栈组成的队列
编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)
思路:一个栈正常入栈,之后倒入另一个辅助栈,辅助栈倒出即可实现。特别注意两点需要控制,倒入help辅助栈前,help必须为空,倒入help栈时,必须将data栈排空

public static class TwoStackQueue{public Stack<Integer> stackPush;public Stack<Integer> stackPop;public TwoStackQueue(){stackPush = new Stack<Integer>();stackPop = new Stack<Integer>();}public void add(int pushInt){stackPush.push(pushInt);}public int poll(){if(stackPop.empty() && stackPush.empty()){throw new RuntimeException("Queue is empty!");}else if(stackPop.empty()){while(!stackPush.empty()){stackPop.push(stackPush.pop());}}return stackPop.pop();}public int peek(){if(stackPop.empty() && stackPush.empty()){throw new RuntimeException("Queue is empty!");}else if(stackPop.empty()){while(!stackPush.empty()){stackPop.push(stackPush.pop());}}return stackPop.peek();}
}

3.3.由两个队列组成的栈
编写一个类,用两个队列实现栈,支持栈的基本操作(push、poll、peek)

public static class Queue<T>{private LinkedList<T> queue = new LinkedList<T>();//LinkedList标准的双端队列,ArrayList是动态数组,在刷题阶段时使用链表时用LinkedListpublic boolean isEmpty(){return queue.isEmpty();}public int size(){return queue.size();}public void add(T value){queue.addFirst(value);}public T pull(){return queue.pullLast();}public T peek(){return queue.peek();}
}
public static class Stack<T>{private Queue<T> dQueue = new Queue<T>();private Queue<T> hQueue = new Queue<T>();public boolean isEmpty(){return dQueue.isEmpty();}public int size(){return dQueue.size();}public void push(T value){dQueue.add(value);}public T pop(){if(dQueue.isEmpty()){throw new RuntimeException("Queue is empty!");}while(dQueue.size()!=1){hQueue.add(dQueue.pull());}T res = dQueue.pull();while(!hQueue.isEmpty()){dQueue.add(hQueue.pull());}return res;}public T peek(){if(dQueue.isEmpty()){throw new RuntimeException("Queue is empty!");}while(dQueue.size()!=1){hQueue.add(dQueue.pull());}T res = dQueue.pull();hQueue.add(res);while(!hQueue.isEmpty()){dQueue.add(hQueue.pull());}return res;}}

栈和队列的算法题总结相关推荐

  1. C语言【数据结构】栈和队列【OJ题(C++)、选择题】

    目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...

  2. 【HDU - 1702 】ACboy needs your help again! (栈和队列,水题模拟)

    题干: ACboy was kidnapped!!  he miss his mother very much and is very scare now.You can't image how da ...

  3. 栈和队列常见oj题(括号匹配问题、栈实现队列、队列实现栈、设计循环队列)

    一.括号匹配问题 1.题目要求: 2.大体思路 遍历这个字符串,如果是左括号就让它入栈,如果是右括号就让它和栈顶元素进行匹配(前提是栈中有元素),匹配成功的话就让栈顶元素出栈,匹配失败就返回false ...

  4. Leetcode 剑指 Offer 09. 用两个栈实现队列 (每日一题 20210915)

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

  5. 栈的输出_算法:栈和队列题目集合(一)

    前言 栈和队列是算法的一个基本的知识点之一.这篇文章主要介绍三道有关栈和队列的算法题.因为篇幅所限,只介绍push和pop这两种方法的实现 用栈实现队列 用队列实现栈 循环队列的实现 用栈实现队列 入 ...

  6. 栈和队列-第3章-《数据结构题集》习题解析-严蔚敏吴伟民版

    习题集解析部分 第3章 栈和队列 --<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解 ...

  7. 算法题-----题目、题解、个人算法、个人思考

    算法题-----题目.题解.个人算法.个人思考,项目说明]这里记录算法题目,这里记录:算法题目简单描述,暂存对于这道题的SK_cache(自己的卡点.自己的思路.自己对这道题的理解,自己的疑问.自己对 ...

  8. 《数据结构》实验三:栈和队列实验 (实验报告)

    一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试 ...

  9. 王道——数据结构——栈和队列(1)

    系列文章目录 其他章节相关文章 王道--数据结构--树与二叉树(1) 本章节其他相关文章 文章目录 系列文章目录 其他章节相关文章 本章节其他相关文章 前言 一.栈的顺序存储 一.顺序栈 二.共享栈 ...

最新文章

  1. 传承乡邦文化,展示国学之美,联墨香飘远,文明花放红;
  2. Java自学笔记(13):【面向对象】方法覆盖,final关键字,对象转型
  3. 如何系统地理解「交易平台」?
  4. 《JavaScript设计模式与开发实践》模式篇(5)—— 观察者模式
  5. linux 更改文件权限(子文件夹)
  6. 全国计算机考试真考题库4,全国计算机等级考试无纸化真考题库试卷二级C--(4)资料.docx...
  7. js 点击闭包_【JS进阶】Javascript 闭包与Promise的碰撞
  8. awk if 不包含_linux三剑客之awk
  9. 电脑计算机不见桌面,桌面上我的电脑(计算机)不见了怎么办?【图】
  10. RHEL6与Oracle 11G R2之开篇:安装
  11. 将一副遥感影像裁剪为多幅图像
  12. muduo 异步日志实现
  13. ISO4443A与ISO14443B的区别
  14. 在群晖Docker上搭建自己项目管理工具Focalboard
  15. 作为审稿人,你什么情况下会选择拒稿?
  16. springboot 启动banner 打印 佛祖保佑
  17. 关于电话电子邮件诈骗的骨感
  18. 2020年10月份电脑选购计划
  19. 编译ros21讲中的服务端Server时报错
  20. 季节前面为什么用in_季节前面用in还是on

热门文章

  1. C语言复习2_运算符
  2. 开发文档之 概要设计说明书 详细设计说明书 数据库设计说明书
  3. 使用纯C语言开始win32 sdk编程
  4. OV5640全景模式预览倒180度,拍照正常的问题
  5. 使用Silverlight for Embedded开发绚丽的界面(2)
  6. python第一周小测验_荐测验1: Python基本语法元素 (第1周)
  7. Mysql索引命中问题
  8. 当 Vue 处理数组与处理纯对象的方式一样
  9. 基本的输入输出函数介绍
  10. ThinkPHP源码学习 data_to_xml函数 数据转成xml格式