1.栈和队列的简单介绍

1.1 栈的简单介绍

栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈。在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现。

Java中的实现类:

Stack:

Stack<Integer> stack1 = new Stack<>();

相应方法:

push(Element): 把元素压栈

pop(Element): 把元素从栈中弹出

Deque:

Deque<Integer> stack2 = new LinkedList<>();
Deque<Integer> stack3 = new ArrayDeque<>();

相应方法:

push(Element) : 把元素压栈

pop(Element): 把元素弹出

addFirst(Element): 等效压栈

removeFirst(Element): 等效弹出

 1.2 队列的简单介绍

队列,一种数据结构,先进先出,主要类型有三种,单向队列,双端队列,循环队列。

单向队列

双端队列

循环队列

说到循环队列,leetcode也有经典的题目,实现循环队列,leetcode622

 主要实现类 ArrayDeque

和1.1栈的实现一样,队列的实现也是用Deque,因为用双端队列可以模拟单向队列,所以单向和双端队列都用ArrqyDeque实现,循环队列的实现可以参考leetcode622.

相应方法

add(Element) : 在队列尾部添加一个元素  offer() 和add一样但返回是否成功

remove(Element): 删除队列中第一个元素 poll() 和remove一样但为null时不会报错

其他常用方法

clear() 清空队列

peek() 获取第一个元素

isEmpty() 是否为空

2. 用队列实现栈

2.1  leetcode225 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

class MyStack {Deque<Integer> list1;Deque<Integer> list2;public MyStack() {list1 = new ArrayDeque<>();list2 = new ArrayDeque<>();}public void push(int x) {list2.add(x);while(!list1.isEmpty()){list2.add(list1.remove());//add poll}Deque<Integer> temp = list1;list1 = list2;list2 = temp;}public int pop() {return list1.remove();}public int top() {return list1.peek();}public boolean empty() {return list1.isEmpty();}
}

本题小结

(1)一个主队列,一个辅助队列,主队列时刻保持最新状态

(2)主队列保持最新就意味着(top/Empty/pop)等操作都对最新的队列即主队列操作

(3)来一个新的元素放到辅助队列,然后把主队列的元素都丢到辅助队列,交换即最新

以题中的案例为例,画出主辅队列的变化:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

上图,更容易理解

2.2  leetcode225 用队列实现栈(一个队列)

在2.1中用的是两个队列实现一个栈,题目限定了两个队列,那么用一个队列也是可以的。

class MyStack {Deque<Integer> list1;public MyStack() {list1 = new ArrayDeque<>();}public void push(int x) {int n = list1.size();list1.add(x);for(int i = 0; i < n; i++){list1.add(list1.remove());}}public int pop() {return list1.remove();}public int top() {return list1.peek();}public boolean empty() {return list1.isEmpty();}
}

直接上图

3. 用栈实现队列

3.1 leetcode232 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

class MyQueue {Deque<Integer> instack;Deque<Integer> outstack;public MyQueue() {instack = new LinkedList<>();outstack = new LinkedList<>();}public void push(int x) {instack.push(x);}public int pop() {  if(outstack.isEmpty()){in2out();}return outstack.pop();}public int peek() {if(outstack.isEmpty()){in2out();}return outstack.peek();}public boolean empty() {return instack.isEmpty()&&outstack.isEmpty();}public void in2out(){while(!instack.isEmpty()){outstack.push(instack.pop());}}
}

本题小结

        (1)两个栈,主栈和辅栈,辅栈负责向外输出

        (2)判空要两个栈都判断

以题中的案例为例,画出主辅栈的变化:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

上图

参考来源 【1】leetcode 用队列实现栈  官方解题

【2】leetcode 御三五   【栈】用栈实现队列

栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~相关推荐

  1. 利用数据结构队列来实现医院挂号模拟看病系统(c++实现超详细)

    如何利用简单队列实现完整的程序 文章目录 程序功能概览 一.项目要求 二.使用步骤 1.引入库 2.读入数据 总结完整代码 程序功能概览 一.项目要求 二.使用步骤 1.引入库 代码如下(示例): # ...

  2. 实现if_数组实现固定栈和队列+栈与队列相互实现

    文章目录 一.数组实现固定栈和队列 1.数组实现固定栈 2.数组实现固定队列 二.栈与队列相互实现 1.两个队列实现栈 2.两个栈实现队列 一.数组实现固定栈和队列 1.数组实现固定栈 代码如下: c ...

  3. 【数据结构】栈和队列OJ练习(栈和队列相互实现+循环队列实现)

    目录 前言 1.用队列实现栈 2.用栈实现队列 3.循环队列 前言 前面在学习了栈和队列的实现之后,相信大家对栈和队列的结构和使用方式都有了一些理解. 下面我们就来进行一些练习,这这章的练习相对于原来 ...

  4. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

  5. java 栈队列区别是什么意思_Java实现数据结构栈stack和队列Queue是什么?

    回顾JDK提供的集合类 容器(集合)框架如下: 集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身. 集合类型主要有3种:set(集).list(列表)和map(映射). C ...

  6. 数据结构(C语言第二版)严蔚敏编,数据结构电子教材,线性表,栈,队列,顺序存储结构,初始化,入栈,出栈,入队,出队,c++

    前言 提示:本篇文章收录严蔚敏编写的数据结构C语言版本 简单介绍一下顺序表,顺序栈,循环队列,的顺序存储结构之间的区别 代码参考严蔚敏编写的<数据结构>,二维码动态演示可扫码可观看. - ...

  7. 栈和队列(超详细Java实现)

    栈和队列 一.栈(Stack) 1.概念 2.栈的使用 3.模拟实现一个栈 1. 构造方法 2. 入栈(push) 3. 出栈(pop) 4.获取栈顶元素(peek) 5.获取元素个数(getSize ...

  8. 两顺序栈共享Java_数据结构与算法(三),栈与队列

    上一篇<数据结构与算法(二),线性表>中介绍了数据结构中线性表的两种不同实现--顺序表与链表.这一篇主要介绍线性表中比较特殊的两种数据结构--栈与队列.首先必须明确一点,栈和队列都是线性表 ...

  9. 队列判空_三分钟基础:什么是队列?

    作者 |  小鹿 来源 |  小鹿动画学编程 写在前边 像线程池.异步队列.消息队列等有限的资源容器中,往往存储大量的任务事件,这些大量的任务事件需要进行有条理的进行任务分发以及各种情况处理,为了能够 ...

最新文章

  1. react源码总览(翻译)
  2. 0406复利计算5.0--结对
  3. 给3月要跳槽的前端提个醒!不了解微前端就别去面试了,不然……
  4. java中的位移运算符_java中的移位运算符(, , )
  5. Spark入门(Python)
  6. debounce实现 js_Vue.js以组件或者插件的形式实现throttle或者debounce
  7. 查看windows电脑CPU核心数,线程数
  8. Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署
  9. 【爬坑日记】vue中传props时默认为Boolean问题
  10. Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
  11. 高通QCA9531 2.4GHz电梯监控无线CPE
  12. matlab 图例legend中实现换行
  13. 史上最详细Excel制作生命游戏,体验生命演化。
  14. 移动端微信QQ分享一个h5激活app
  15. 转载:常用 Git 命令清单 by 阮一峰
  16. 【计算机网络】负载均衡
  17. element-plus中el-dialog导致props报错问题解决
  18. javascript读写二进制
  19. 全新线控制动系统产品发布,清智科技正式完成业务拓展
  20. 利用PuTTY配置端口映射,实现外网对服务器的访问

热门文章

  1. 【JAVA菜鸟碎碎念】问号表达式
  2. Docker 网络解读
  3. Dynamics CRM2013 Server2012下部署ADFS和IFD遇到的问题
  4. 图片上传问题(后台管理系统)
  5. 一文带你了解自恢复保险丝与熔断保险丝区别,你了解多少?
  6. 基础C语言知识串串香14☞增补知识
  7. FFmpeg 搭建本地屏幕录制环境
  8. css3如何写下拉菜单,css如何实现下拉菜单 超详细
  9. vin识别(车架号)解析
  10. 有关仓库仓位的管理问题