JAVA:使用栈实现一个队列
使用栈实现一个队列,需要弄清楚栈和队列的区别:
栈:先进后出;
队列:先进先出。
实现思路:
1)通过两个栈(pushStack / popStack)对倒,确保 popStack 栈的出栈顺序与队列出列一致。
2)核心难点在加入队列操作,假设队列中已经加入1、2、3、4,加入5的过程:
2.1)假设已经加入1/2/3/4
2.2)把popStack中的数据导入pushStack
2.3)pushStack加入5
2.4)把pushStack中的数据导入popStack
流程示意图如下:

实现代码:
import java.util.Stack;
public class QueueWithStack<T> {
/**
* Test 测试代码
*/
public static void main(String[] args) {
QueueWithStack<Integer> queue = new QueueWithStack<>();
queue.add(1);
System.out.println("入队列:1");
queue.add(2);
System.out.println("入队列:2");
queue.add(3);
System.out.println("入队列:3");
queue.add(4);
System.out.println("入队列:4");
System.out.println("出队列:" + queue.pop());
System.out.println("出队列:" + queue.pop());
queue.add(5);
System.out.println("入队列:5");
queue.add(6);
System.out.println("入队列:6");
System.out.println("====================");
while (false == queue.isEmpty()) {
System.out.println("出队列:" + queue.pop());
}
System.out.println("队列内元素个数:" + queue.size());
}
// 入栈是,将数据写入该集合,然后在推向pop集合。
private Stack<T> pushStack = null;
// 出站时,读取该集合
private Stack<T> popStack = null;
public QueueWithStack() {
pushStack = new Stack<>();
popStack = new Stack<>();
}
public boolean isEmpty() {
return popStack.isEmpty();
}
public int size() {
return popStack.size();
}
public void add(T t) {
while (false == popStack.isEmpty()) {
T val = popStack.pop();
pushStack.push(val);
}
pushStack.add(t);
while (false == pushStack.isEmpty()) {
T val = pushStack.pop();
popStack.push(val);
}
}
/**
* 从队列中取出数据,并从队列中移除数据
*/
public T pop() {
if (isEmpty()) {
throw new RuntimeException("Queue is empty.");
}
return popStack.pop();
}
/**
* 获取栈顶元素,但不会从队列中移除数据
*/
public T peek() {
if (isEmpty()) {
throw new RuntimeException("Queue is empty.");
}
return popStack.peek();
}
}
打印结果:
入队列:1
入队列:2
入队列:3
入队列:4
出队列:1
出队列:2
入队列:5
入队列:6
====================
出队列:3
出队列:4
出队列:5
出队列:6
队列内元素个数:0
JAVA:使用栈实现一个队列的更多相关文章
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...
- Python两个栈实现一个队列
牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...
- web前端面试系列 - 数据结构(两个栈模拟一个队列)
一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...
- python两个队列实现一个栈和两个栈实现一个队列
1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...
- python---两个栈实现一个队列
class Solution: """两个栈实现一个队列""" def __init__(self): # 接收栈 self.accept_ ...
- 剑指offer(五):用两个栈实现一个队列
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
- 剑指offer:用两个栈实现一个队列
题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...
- 用两个栈实现一个队列(C++)
分析 栈:后进先出 队列:先进先出 要使用两个栈实现队列(先进先出),主要思路是 1.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...
随机推荐
- SG-UAP常用注解介绍
注解基本介绍 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...
- 【python】文件下载---基础版
基于TCP协议的基础版本,不支持大文件 Client.py import socket def main(): # 1. 创建套接字 tcp_socket = socket.socket(socket ...
- pandas之数据处理
首先,数据加载 pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,期中read_csv和read_table这两个使用最多. 1.删除重复元素 使用duplicated()函数 ...
- 基于JFinal中搭建wopi协议支撑办法
1.添加maven依赖 <dependency> <groupId>com.github.icecooly</groupId> <artifactId> ...
- 用java刷剑指offer(数组中只出现一次的数字)
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 牛客网链接 思路 链接:https://www.nowcoder.com/questionTer ...
- docker学习5-docker安装tomcat环境和部署war包
前言 tomcat部署web项目非常方便,把war包放到webapps目录就可以了.本篇使用docker快速搭建一个tomcat环境 下载tomcat镜像 拉取官方最新版tomcat镜像 [root@ ...
- 《The One 团队》:第九次团队作业:BETA冲刺与团队项目验收
项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件黑盒测试技术:(2)学会编制软件项目总结PPT.项目验收报告:(3) ...
- oracle 年龄分档,不用case when 的方法
一般我们出分档数据都是case when ,但是如果是对年龄等一些字段进行细分,比如五岁一档,我们如果用case when就会特别麻烦,写的特别多,这里我介绍一种简单的方法,对细分的字段进行处理: 建 ...
- 删除WordPress菜单wp-nav-menu中li的class或id样式
我们都知道wordpress已经集成了一些通用的css样式,比如wp-nav-menu菜单会有很多的class,不想看到那么多的选择器,想要清净的世界要如何操作呢?随ytkah一起来看看 <li ...
- lis框架showoncodename的用法
fm.Sex.value=tContent2[0][3];//这个一定得是查询出来的码值alert("获取到的值是:"+tContent2[0][3]);showOneCodeNa ...