面试题7:用两个栈实现队列

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


解题思想:假设有栈stack1和stack2,依次插入元素a、b、c,只需直接插入到stack1中;

                  要删除队列头部时,需要将a、b、c先弹出并依次存入stack2,再弹出stack2的尾结点a即可;

                  此时要插入元素d,仍然插入stack1;若要删除元素则stack2弹出,当stack2为空时将stack1的元素按上步思路依次弹出再存入stack2中。

                  综上,队列插入元素,直接将元素插入stack1;

                             队列删除元素,则从stack2弹出元素,如果stack2为空,则将stack1中的元素依次弹出并插入stack2中,然后再弹出栈顶元素。(stack2依次出栈元素顺序与删除队列头部的顺序一致,stack1则相反)。


java实现:

public class QueueWithTwoStacks {
	private Stack<Integer> stack1=new Stack<Integer>();
	private Stack<Integer> stack2=new Stack<Integer>();
	
	//插入元素到队尾
	public void appendTail(Integer a) {
		stack1.push(a);
	}
	
	//队头弹出元素
	public Integer deleteHead() {
		if(stack2.isEmpty()) {
			while(!stack1.isEmpty()) {//将stack1中的元素弹出并存入satck2
				stack2.push(stack1.pop());
			}
		}
		return stack2.pop();
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值