【剑指offer第2版-第10题-JAVA】

使用两个栈实现一个队列

题目:请使用两个栈实现一个队列,队列声明如下:请实现它的两个函数appendTail(队列尾部插入节点)和deleteHead(移除队列头部节点)。

考察点:
主要考察栈和队列的理解,以及通过画图把抽象的问题形象化。
分析思路:
队列的特性:先进先出
栈的特性:先进后出
如图所示,用两个栈实现的队列,元素会先压入第一个栈,当需要移除元素时,我们再把第一个栈的元素弹出,压入第二个栈,再弹出,进而达到了我们使用两个栈实现一个队列的目的,上代码。

+---+          +---+
| 3 |          | 1 |
+---+          +---+
| 2 |          | 2 |
+---+          +---+
| 1 |          | 3 |
+---+          +---+
Stack-input   Stack-out 
 

代码如下:

import java.util.Stack;
//使用泛型
public class MyQueue<T> {
    //输入栈-注意命名规范
    private Stack<T> inputStack;
    //输出栈
    private Stack<T> outStack;

    //添加构造函数,便于测试
    public MyQueue(Stack inputStack, Stack outStack) {
        this.inputStack = inputStack;
        this.outStack = outStack;
    }

    //尾部添加元素
    public void appendTail(T element) {
        inputStack.push(element);
    }

    //移除头部元素
    public T deleteHead() {
        //如果第二个栈为空,则将第一个栈的栈顶元素不断的压入第二个栈
        if(outStack.empty()){
            while(!inputStack.empty()) {
                outStack.push(inputStack.pop());
            }
        }
        //如果此时第二个输出栈依旧为空,则代表两个栈均为空,没有元素
        if(outStack.empty()){
            System.out.println("MyQueue is empty");
            return null;
        }
        return outStack.pop();
    }
    //测试用例
    public static void main(String[] args) {
        Stack inputStack = new Stack();
        Stack outStack = new Stack();
        //泛型 使用String -Integer 来测试
        MyQueue<String> stringQueue = new MyQueue(inputStack,outStack);
        stringQueue.appendTail("a");
        stringQueue.appendTail("b");
        stringQueue.appendTail("c");
        System.out.println(stringQueue.deleteHead());
        System.out.println(stringQueue.deleteHead());
        stringQueue.appendTail("d");
        System.out.println(stringQueue.deleteHead());
        System.out.println(stringQueue.deleteHead());
        System.out.println(stringQueue.deleteHead());


        MyQueue<Integer> integerQueue = new MyQueue(inputStack,outStack);
        integerQueue.appendTail(1);
        integerQueue.appendTail(2);
        integerQueue.appendTail(3);
        System.out.println(integerQueue.deleteHead());
        System.out.println(integerQueue.deleteHead());
        integerQueue.appendTail(4);
        System.out.println(integerQueue.deleteHead());
        System.out.println(integerQueue.deleteHead());
        System.out.println(integerQueue.deleteHead());
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值