【剑指offer】(扩展)两个队列实现栈

本文介绍了一种使用两个队列实现栈的方法,并提供了详细的步骤解释和Java代码实现。通过巧妙地利用队列的先进先出特性,实现了栈的先进后出特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

用两个队列来实现一个,完成的Push和Pop操作。中的元素为int类型。


分析:

(1)清楚队列和栈的特性:栈--先进后出;队列--先进先出。

(2)知道java中实现队列的方式:Queue接口,LinkedList实现类。

(3)操作过程难以理解的话,结合队列与栈的图例进行分析。

刚开始,入栈的元素添加到第一个队列中,当需要出栈的时候,发现此时能弹出的元素只有第一个,而栈需要的是最后一个,因此需要将元素倒入第二个队列中,此时如果全部倒入,相当于第二个队列的顺序和之前第一个顺序完全相同(如,队列1中的1,2,3,全部倒入队列2中,还是1,2,3)。这里需要变通一下,要弹出的元素是最后一个,那就将第一个队列中的元素倒入n-1个,最后一个弹出,不倒入另一个队列。此时,弹出最后一个元素后有一个空的队列。至此出栈可以实现。

入栈还需要注意,如果向两个栈模拟一个队列一样,始终在一个队列里将元素加入,再出栈的时候倒入另一个队列次序就改变了。因此需要将每次加入元素时加入到不为空的队列中。


实现:

public class test_7 {
	LinkedList<Integer> queue1 = new LinkedList<Integer>();
	LinkedList<Integer> queue2 = new LinkedList<Integer>();
	
	public void push(int node){
		if(queue2.size()==0){
			queue1.add(node);
		}else
			queue2.add(node);
		
	}
	
	public int pop(){
		if(queue1.size()==0 && queue2.size()==0)
			return -1;
		if(queue2.size()==0){
			while(queue1.size()>1){
				queue2.add(queue1.remove());
			}
			return queue1.remove();
		}else{
			while(queue2.size()>1){
				queue1.add(queue2.remove());
			}
			return queue2.remove();
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值