使用栈实现一个队列,需要弄清楚栈和队列的区别:

栈:先进后出;

队列:先进先出。

实现思路:

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:使用栈实现一个队列的更多相关文章

  1. java两个栈实现一个队列&&两个队列实现一个栈

    栈:先进后出  队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...

  2. Python两个栈实现一个队列

    牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...

  3. web前端面试系列 - 数据结构(两个栈模拟一个队列)

    一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...

  4. python两个队列实现一个栈和两个栈实现一个队列

    1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...

  5. python---两个栈实现一个队列

    class Solution: """两个栈实现一个队列""" def __init__(self): # 接收栈 self.accept_ ...

  6. 剑指offer(五):用两个栈实现一个队列

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...

  7. 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。

    一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...

  8. 剑指offer:用两个栈实现一个队列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...

  9. 用两个栈实现一个队列(C++)

    分析 栈:后进先出 队列:先进先出 要使用两个栈实现队列(先进先出),主要思路是 1.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...

随机推荐

  1. Android canvas.save()与canvas.restore()的使用总结

    含义canvas.save(); 画布将当前的状态保存canvas.restore(); 画布取出原来所保存的状态使用 canvas.save();与canvas.restore();一般结合使用,. ...

  2. Jmeter学习笔记(二十三)——生成HTML性能报告

    有时候我们写性能报告的时候需要一些性能分布图,JMeter是可以生成HTML性能报告的.这篇博客,简单介绍下在利用jmeter进行性能测试时,是如何生成HTML的可视化测试报告的 一.准备工作 1:j ...

  3. Alpha_6

    一. 站立式会议照片 二. 工作进展 (1) 昨天已完成的工作 a. 修改设计图的小毛病 b. 补签卡页面 c. 实现我的,我的卡包,卡片细节功能页面,并可预览 d. 已实现“番茄钟_数据统计”页面和 ...

  4. 【RMAN】RMAN脚本中使用替换变量

    [RMAN]RMAN脚本中使用替换变量--windows 下rman全备脚本 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

  5. Python +appium logger

    封装日志模块 import logging def get_log(): # 配置日志参数 logger = logging.getLogger() logger.setLevel(logging.I ...

  6. oracle中LPAD和RPAD函数的使用方法(加个人总结)

    今天看到两个没有见过的SQL中的函数,总结一下: 函数参数:lpad( string1, padded_length, [ pad_string ] ) 其中 string1:源字符串 padded_ ...

  7. GitHub与Markdown(学习笔记)

    一.学前提问: 1.GitHub用翻墙吗? 访问 GitHub 不用翻墙,只是可能访问速度稍慢些. 2.英语差学得会吗? GitHub 虽然都是英文,但是,对英语水平的要求不是那么高,都是些简单的单词 ...

  8. [HTML5] Using HTMLPortalElement to improve MPA preformance

    For multi pages application, it is very slow to navgiate between page by page, because it needs to r ...

  9. 使用terraform 进行gitlab 代码仓库批量迁移

      gitlab 的代码是在文件目录中,这个对于批量迁移很简单,只需要copy 文件夹(但是对于不同gitlab server 可能需要重新设置目录权限) 几个问题 大批量仓库tf resource问 ...

  10. 完美兼容IE10以下所有版本

    IE一直是个恶心东西 各种不支持 现在发现了个好东西可以兼容ie10以下所有浏览器 <!--[if lte IE 9]><script>window.location.href ...