题目:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

思路:

首先定义两个栈stack1、stack2,stack1用于插入,stack2用于删除。删除时如果直接出栈就无法实现先进先出,这时需要将stack1中的所有元素从stack1出栈,然后依次压入stack2中,然后再从stack2中出栈。如果stack2中有元素存在,那么直接出栈,无需将stack1中元素压入stack2中。只有当stack2中元素都为空时,才需要将stack1中元素取出。

代码:

 import java.util.Stack;

 /**
  *  两个栈实现队列
  * @author wydream
  *
  */

 public class TwoStackQueue {

     private Stack<Object> s1;//s1插入元素
     private Stack<Object> s2;//s2删除元素

     public TwoStackQueue() {
         s1=new Stack<Object>();
         s2=new Stack<Object>();
     }

     //插入元素
     public void push(Object obj) {
         s1.push(obj);
     }

     //元素出队列
     public Object pop() {
         if(s2.empty()&&s1.empty()) {
             return null;
         }
         if(s2.empty()) {
             System.out.println("s1中数据进入到s2");
             while(!s1.empty()) {
                 Object obj=s1.pop();
                 s2.push(obj);
             }
         }
         return s2.pop();
     }

     public static void main(String[] args) {
         TwoStackQueue tq=new TwoStackQueue();
         tq.push("北京");
         tq.push("上海");
         tq.push("深圳");
         tq.push("杭州");
         System.out.println(tq.pop());
         System.out.println(tq.pop());
         System.out.println(tq.pop());
         tq.push("武汉");
         System.out.println(tq.pop());
         System.out.println(tq.pop());
     }

 }

相关题目——两个队列实现栈:

 import java.util.LinkedList;
 import java.util.Queue;

 /**
  * 两个队列实现栈
  *
  * @author wydream
  *
  */

 public class TwoQueueStack {

     private Queue<String> queue1=new LinkedList<String>();
     private Queue<String> queue2=new LinkedList<String>();

     //向栈中压入元素
     public void push(String value) {
         //两个队列都为空时,优先考虑queue1
         if(queue1.isEmpty()&&queue2.isEmpty()) {
             queue1.add(value);
             return;
         }

         //如果queue1为空,queue2中有数据,则直接放入queue2中
         if(queue1.isEmpty()) {
             queue2.add(value);
             return;
         }

         //如果queue2为空,queue1有数据,直接放入queue1中
         if(queue2.isEmpty()) {
             queue1.add(value);
             return;
         }
     }

     //从栈中弹出一个数据
     public String pop() {
         //两个栈都为空
         if(queue1.isEmpty()&&queue2.isEmpty()) {
             System.out.println("栈为空");
             return null;
         }
         //如果queue1中没有元素,queue2中有元素,将其queue2中的元素依次放入queue1中,直到最后一个元素,弹出即可
         if(queue1.isEmpty()) {
             while(queue2.size()>1) {
                 queue1.add(queue2.poll());
             }
             return queue2.poll();
         }
         //如果queue2中没有元素,queue1中有元素,将其queue1中的元素依次放入queue2中,直到最后一个元素,弹出即可
         if(queue2.isEmpty()) {
             while(queue1.size()>1) {
                 queue2.add(queue1.poll());
             }
             return queue1.poll();
         }
         return null;
     }

     public static void main(String[] args) {
         TwoQueueStack ts=new TwoQueueStack();
         ts.push("北京");
         ts.push("上海");
         ts.push("广州");
         ts.push("深圳");

         System.out.println(ts.pop());
         System.out.println(ts.pop());
         ts.push("苏州");
         ts.push("杭州");
         System.out.println(ts.pop());
         System.out.println(ts.pop());

     }

 }

剑指offer(9)——用两个栈实现队列的更多相关文章

  1. 《剑指offer》用两个栈实现队列

    本题来自<剑指offer> 用两个栈实现队列 题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 队列定义:先进先出 栈定义:先进后出 要 ...

  2. 剑指 Offer 09. 用两个栈实现队列

    剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的 ...

  3. [Leetcode]225. 用队列实现栈 、剑指 Offer 09. 用两个栈实现队列

    ##225. 用队列实现栈 如题 ###题解 在push时候搞点事情:push时入队1,在把队2的元素一个个入队1,再交换队2和队1,保持队1除pushguocheng 始终为空. ###代码 cla ...

  4. 剑指 Offer 09. 用两个栈实现队列 +java中栈和队列的使用

    剑指 Offer 09. 用两个栈实现队列 题目链接 class CQueue { private Stack<Integer> sta1; private Stack<Intege ...

  5. 力扣 - 剑指 Offer 09. 用两个栈实现队列

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 09. 用两个栈实现队列 思路 刚开始想的是用stack1作为数据存储的地方,stack2用来作为辅助栈,如果添加元素直接push入stac ...

  6. 菜鸟刷题路:剑指 Offer 09. 用两个栈实现队列

    剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的 ...

  7. 【Java】 剑指offer(8) 用两个栈实现队列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集  题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数append ...

  8. [剑指offer]09用两个栈实现队列插入和删除操作,C++实现

    原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...

  9. Go语言实现:【剑指offer】用两个栈实现队列

    该题目来源于牛客网<剑指offer>专题. 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. Go语言实现: var list1 = list.New( ...

  10. 剑指OFFER之用两个栈实现队列(九度OJ1512)

    题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例.对于每个测试样例,第一行输入一个n(1<=n<=100 ...

随机推荐

  1. CodeForces - 1183E Subsequences (easy version) (字符串bfs)

    The only difference between the easy and the hard versions is constraints. A subsequence is a string ...

  2. Alpha项目冲刺! Day5-产出

    各个成员今日完成的任务 林恩:任务分工,博客撰写,了解安卓环境搭建 杨长元:安卓本地数据库基本建立 李震:改了图标和背景 胡彤:完善服务端 寇永明:研究测试代码 王浩:研究测试代码 李杰:研究测试代码 ...

  3. 小福bbs-凡事预则立

    [小福bbs-凡事预则立] 1.冲刺的时间计划安排(冲刺时间为期七天,安排在2019-11-3--2019-11-14之间) 冲刺的时间 计划安排 2019.11.7 开会,安排具体工作 2019.1 ...

  4. LeetCode 222. 完全二叉树的节点个数(Count Complete Tree Nodes)

    题目描述 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位 ...

  5. 如何获取UA?

    代码: function whatBrowser() { document.Browser.Name.value = navigator.appName; document.Browser.Versi ...

  6. Ajax 是什么? 如何创建一个Ajax?

    ajax的全称:Asynchronous Javascript And XML. 异步传输+js+xml. 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他 ...

  7. python arcgis

  8. 常用API的注意事项

    判断定义为String类型的s1和s2是否相等 • String s1 = "abc"; • String s2 = "abc"; //常量池中没有这个字符串对 ...

  9. ELK 二进制安装并收集nginx日志

    对于日志来说,最常见的需求就是收集.存储.查询.展示,开源社区正好有相对应的开源项目:logstash(收集).elasticsearch(存储+搜索).kibana(展示),我们将这三个组合起来的技 ...

  10. Flutter 中使用Future消除Callback Hell

    /先分别定义各个异步任务 Future<String> login(String userName, String pwd){ ... //用户登录 }; Future<String ...