第9题:用两个栈实现队列

1. 题目

在这里插入图片描述

  • 题目输入输出的意思:
    • 输入 CQueue,appendTail,deleteHead,deleteHead。[ [], [3], [], [] ]
      • 表示,先实例化CQueue类,然后进行appendTail(3),然后deleteHead(),再deleteHead() 。注意:数组中的3就是操作数!
      • 然后输出结果是:
        • null( 创建对象无返回值 )
        • null(appendTail()无返回值 )
        • 3( 此时A栈只有一个元素3,B栈空,那么此时deleteHead()返回值就是3 )
        • -1( AB都空,返回-1 )

2. 思路

  • 此题的意思是实现一个队列类,有2个方法,appendTail():队列尾部插入整数。deleteHead():队列头部删除整数。但是函数内部代码需要用2个栈实现。

在这里插入图片描述

如图所示
	我们使用
		stackA 来实现 appendTail()
		stackB 来实现 deleteHead()

	appendTail():直接push入A栈

	deleteHead():
		如果B栈有元素,弹出B栈栈顶元素
		如果B栈没有元素:
			如果A栈没有元素,此时AB都无元素,表示队列为空,return -1;
			如果A栈有元素,把A栈 所有 元素弹出然后入B栈,然后返回B栈顶元素即可。

-----------------------------------------------------------------------------------------------
注意点:
	1. deleteHead删除时,如果B栈没有元素A有元素,必须把A--所有--  元素先入B栈才行,不能只入部分。
因为这样如果再appendTail(),那么队列的顺序就改变了,可以自己模拟一下。
	

3. 代码

import java.util.Stack;
class CQueue {

    Stack<Integer> stackA, stackB;
    // 构造函数
    public CQueue() {
        stackA = new Stack<Integer>();
        stackB = new Stack<Integer>();
    }
    
    public void appendTail(int value) {
        stackA.push(value);
    }
    
    public int deleteHead() {
        // B栈不空
        if(!stackB.empty()){
            return stackB.pop(); 
        }
        // B不空
        else{
            // B栈空,A也空
            if(stackA.empty()){
                return -1;
            }
            else{
                // B栈空,A不空
                while(!stackA.empty()){
                    // A所有元素入B栈
                    stackB.push(stackA.pop());
                }
                return stackB.pop();
            }
        }
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * 你的队列将会以下面步骤实例化。
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值