zoukankan      html  css  js  c++  java
  • 由两个栈组成队列

    【题目】

                 编写一个类,用两个栈实现队列,支持队列的基本操作(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 }

    【运行结果】

    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    Nginx 配置对流量、连接和请求的限制
    linux iptables规则介绍
    Javascript 语言精粹 代码片段合集
    Wowza® Media Systems 使用配置手册。
    如何去除My97 DatePicker控件上右键弹出官网的链接
    [转载]jQuery诞生记-原理与机制
    java swing JButton文字显示异常
    c# 内存拷贝 解决json序列化丢失私有数据(二进制序列化反序列化)
    c# Marshal 将字节数组转为结构 封装协议
    c# 串口通信及模拟串口进行调试
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9574362.html
Copyright © 2011-2022 走看看