当前位置: 首页 > news >正文

由两个栈组成队列

【题目】

             编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。

【解答】​

            栈的特点是先进后出,而队列的特点是先进先出。我们用两个栈正好能把顺序反过来实现类似队列的操作。

            具体实现上,是把一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush;另一个栈只作为弹出栈,在弹出数据时只从这个栈中弹出,记为stackPop。

            因为数据压入栈的时候,顺序是先进先出的。那么只要把stackPush的数据再次压入stackPop中,顺序就变回来了。

将1-5依次压入stackPush,那么从stackPush的栈顶到栈底为5~1,此时依次再将5~1倒入stackPop,那么从stackPop的栈顶到栈底就变成了1~5.再从stackPop中弹出,顺序就和队列一样了。​

            BUT,要做到以下两点:

           (1)如果stackPush要往stackPop中压入数据,那么必须一次性把stackPush中的数据全部压入。

            (2)如果stackPop不为空,stackPush绝对不能向stackPop中压入数据。

            违反以上两点都会发生错误。

【代码】

TwoStackQueue.java:

 1 package cn.hl.p2;
 2 
 3 import java.util.Stack;
 4 /**
 5  * 题目:由两个栈组成的队列
 6  * 要求:用两个栈实现队列,支持队列的基本操作(add、poll、peek)
 7  * @author 猩生柯北
 8  *
 9  */
10 public class TwoStackQueue {
11     public Stack<Integer> stackPush;
12     public Stack<Integer> stackPop;
13     
14     public TwoStackQueue(){
15         stackPush = new Stack<Integer>();
16         stackPop = new Stack<Integer>();
17     }
18     
19     public void add(int pushInt){
20         stackPush.push(pushInt);
21     }
22     
23     public int poll(){
24         if(stackPop.empty() && stackPush.empty()){
25             throw new RuntimeException("Queue is empty!");
26         }else if(stackPop.empty()){
27             while(!stackPush.empty()){
28                 stackPop.push(stackPush.pop());
29             }
30         }
31         return stackPop.pop();
32     }
33     
34     public int peek(){
35         if(stackPop.empty() && stackPush.empty()){
36             throw new RuntimeException("Queue is empty!");
37         }else if(stackPop.empty()){
38             while(!stackPush.empty()){
39                 stackPop.push(stackPush.pop());
40             }
41         }
42         return stackPop.peek();
43     }
44 }

Test.java:

 1 package cn.hl.p2;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         TwoStackQueue tsq = new TwoStackQueue();
 6         tsq.add(3);
 7         tsq.add(8);
 8         tsq.add(-5);
 9         tsq.add(0);
10         tsq.add(8);
11         System.out.print("输出队列的head元素:");
12         System.out.println(tsq.peek());
13         System.out.println("===========");
14         System.out.println(tsq.poll());
15     }
16 
17 }

【运行结果】

 

转载于:https://www.cnblogs.com/zhzcode/p/9574362.html

相关文章:

  • jenkins1
  • 为什么要用到Nginx来做负载均衡?通俗的解释
  • hdu_2955
  • Linux常用命令 — 用户管理useradd、passwd、who、w
  • Python(可变/不可变类型,list,tuple,dict,set)
  • 元素尺寸和位置,scroll事件,事件响应链,事件默认行为
  • 修改input type=file 默认样式
  • 3分钟读懂C语言函数:这些例子一看就懂!|一键删除账户教学
  • ubuntu壁纸1080p
  • [转]bootstrap table本地数据使用方法
  • vue系列自定义指令(三)
  • 源码安装Nginx以及用systemctl管理
  • 以实例说明微服务拆分(以SpringCloud+Gradle)
  • ELK
  • python 小数据池,is and ==,decode ,encode
  • CSS3 变换
  • Go 语言编译器的 //go: 详解
  • idea + plantuml 画流程图
  • Java方法详解
  • JS函数式编程 数组部分风格 ES6版
  • js继承的实现方法
  • Median of Two Sorted Arrays
  • mysql 5.6 原生Online DDL解析
  • oschina
  • Python 反序列化安全问题(二)
  • 动态魔术使用DBMS_SQL
  • 分类模型——Logistics Regression
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 开源SQL-on-Hadoop系统一览
  • 前端设计模式
  • 《天龙八部3D》Unity技术方案揭秘
  • PostgreSQL之连接数修改
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $.ajax()参数及用法
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (九)信息融合方式简介
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net程序集学习心得
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • [ACTF2020 新生赛]Include
  • [BJDCTF 2020]easy_md5
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [Hive] CTE 通用表达式 WITH关键字
  • [HXPCTF 2021]includer‘s revenge
  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • [IE编程] 了解Urlmon.dll和Wininet.dll
  • [MongoDB]------windos下的安装部署与基础使用
  • [MySQL FAQ]系列 -- 账号密码包含反斜线时怎么办
  • [Node + Docker] 聊聊怎么把 nodeclub 构建成 Docker 镜像
  • [POJ 2406]Power Strings[KMP]
  • [Ruby]变量替换