Java 栈和队列的相互转换详解
作者:Word码鸭 发布时间:2021-09-22 05:00:12
标签:Java,栈,队列,转换
栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。
用栈实现队列—力扣232题
题目要求:仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作
使用双栈来实现队列,我们就可以让一个栈储存具体元素,另一个栈做辅助
上图可以看到,新元素进栈时,要确保该栈为空。进入栈的元素按顺序存到辅助栈中,等新元素进入栈之后,再将辅助栈中的元素按顺序出到该栈中。这样操作之后,栈中元素存放的顺序就和队列的一样啦
代码实现:
//双栈模拟队列
public class MyQueue{
//实际存储元素的栈
private Stack<Integer> s1 = new Stack<>();
//辅助栈
private Stack<Integer> s2 = new Stack<>();
public MyQueue() {
}
//将元素 x 推到队列的末尾
public void push(int x) {
if (s1.empty()){//栈为空,直接放入x
s1.push(x);
}else {
//此时不为空
//先把s1所有元素弹出放入s2
while (!s1.empty()){
s2.push(s1.pop());//s2放入的值就是s2弹出的值
//以下两句和上一句相同
// int val = s1.pop();
// s2.push(val);
}
//将新元素直接放入s1,此时新元素就处在s1的栈顶
s1.push(x);
//再次将s2的所有值依次弹出放入s1
while (!s2.empty()){
s1.push(s2.pop());
}
}
}
//从队列的开头移除并返回元素
public int pop() {
return s1.pop();
}
//返回队列开头的元素
public int peek() {
return s1.peek();
}
//判断队列是否为空
public boolean empty() {
return s1.empty();
}
}
用队列实现栈—力扣225题
题目要求:仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作
1. 双队列实现栈
使用双队列实现栈, q1是存储元素的队列,保证q2添加元素之后永远为空队列(新元素直接入q2),保证新元素处在队首。这样的话,新元素入队之后,另外一个队列的元素依次出队然后入队,这样就实现了一个栈。
代码实现:
public class MyStack {
//q1是存储元素的队列
private Queue<Integer> q1 = new LinkedList<>();
//q2是辅助队列
//添加元素后保证q2永远为空
private Queue<Integer> q2 = new LinkedList<>();
public MyStack () {
}
//将元素 x 压入栈顶
public void push(int x) {
//新入队元素直接入q2,成为q2队首
q2.offer(x);
//将q1中的所有元素依次出队,入q2
while (!q1.isEmpty()){
q2.offer(q1.poll());
}
//q1为空,q2为存储元素的队列,互换引用指向
//互换之后,q1任然是存储元素的队列,q2为空
Queue<Integer> temp = q1;
q1 = q2;
q2 = temp;
}
// 移除并返回栈顶元素
public int pop() {
return q1.poll();
}
//返回栈顶元素
public int top() {
return q1.peek();
}
//判断栈是否为空
public boolean empty() {
return q1.isEmpty();
}
}
2.一个队列实现栈
先将元素入队,再将之前的元素依次出队再入队即可!也就是说,保证新元素在队首
代码实现:
public class MyStack {
private Queue<Integer> queue = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
//记录之前元素的个数
int size = queue.size();
//将新元素入队
queue.offer(x);
//将之前的元素依次出队再入队,新元素就在队首位置
for (int i = 0; i < size; i++) {
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
这几个例题实践目的是更加熟悉的掌握和了解栈和队列,实际应用中是不推荐的哦。
来源:https://blog.csdn.net/m0_58672924/article/details/122763811


猜你喜欢
- 1、HttpClient:代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,不建议直接使用。2、RestTemplate: 是 Spri
- 随着Flash应用的流行,网上出现了多种在线Flash版本“连连看”。如“水晶连连看”、“果蔬连连看”等,流行的“水晶连连看”以华丽界面吸引
- ByteArrayInputStream介绍ByteArrayInputStream 是字节数组输入流。它继承于 InputStream。I
- 本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下效果演示代码调用与实现效果xml中调用<
- 本文实例讲述了C#将Sql数据保存到Excel文件中的方法,非常有实用价值。分享给大家供大家参考借鉴之用。具体功能代码如下:public s
- C# SynchronizationContext及Send和Post使用1、(SynchronizationContext)同步上下文的作
- C#实现的获取路由器MAC地址,路由器外网地址。对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码。至于获取路由器的
- 一、return语句执行顺序finally语句是在return语句执行之后,return语句返回之前执行的package exception
- OverView今天在复习的时候,突然复习到我们的相机操作,但是对于相机操作,对于我来说比较复杂的是对于权限的操作。所有我们需要对我们的相机
- 效果自定义密码输入框,项目的一个界面需求,我把这个自定义的输入框提取出来作为这次内容的题目。输入前: 输入后: 输入1个
- 类的初始化顺序在Java中,类里面可能包含:静态变量,静态初始化块,成员变量,初始化块,构造函数。在类之间可能存在着继承关系,那么当我们实例
- 在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:责任链模式是一种对象的行为
- 前言这个东西有啥用,好玩?确实, 好玩归好玩,其实很有使用场景。可以自己选则一些业务节点触发这个机器人助手的消息推送;简单举例:1. 有人给
- AES类时微软MSDN中最常用的加密类,微软官网也有例子,参考链接:https://docs.microsoft.com/zh-cn/dot
- springmvc提供了 * ,类似于过滤器,他将在我们的请求具体出来之前先做检查,有权决定接下来是否继续,对我们的请求进行加工。 * ,可
- where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。1.接口约束。例如,可以声明一个泛型类 MyGeneric
- @Autowired和static的关系一、发生的场景好几次有个同事因为把static用到Spring的@Autowired上,导致注入的对
- 前言有位朋友,某天突然问东哥:在 Java 中,防止重复提交最简单的方案是什么?这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单
- Android 实现获取手机里面的所有图片详解及实例实现代码:public class MainActivity extends Activ
- 本文实例为大家分享了Java实现简单幸运抽奖的具体代码,供大家参考,具体内容如下代码模块:User类:package test1;publi