栈模拟队列

本文详细介绍了如何利用两个栈来模拟一个队列的运作,包括入队(offer)和出队(poll)操作。在Java中,通过创建两个栈,一个用于入队,一个用于出队,实现了队列的FIFO特性。在入队时,如果出队栈非空,则将出队栈的所有元素转移回入队栈,再将新元素入队。出队时,如果入队栈非空,则将入队栈的所有元素转移至出队栈,然后弹出出队栈顶元素。通过这种方式,成功地使用栈模拟了队列的行为。

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

众所周知,Queue队列是一个先进先出(First In First Out)的有序表,只能在队尾添加元素,在队首取出元素。

然而,Stack栈是一种后进先出(LIFO:Last In First Out)的数据结构。 只能不断地往Stack中压入(push)元素,最后进去的必须最早弹出(pop)。

因此,要想用栈来模拟队列,就必须用两个栈来进行入队和出队的操作,用一个栈做入队栈,用另一个栈作为出队栈。

 

当第一次入队操作的时候,将入队的元素放入入队栈,第一次出队操作的时候,将入队栈的元素出栈放入出队栈,然后遍历出队栈;当做第二次入队操作的时候,需要先检查出队栈中是否还有元素,如果有元素,需将出队栈的剩余元素先放入入队栈,然后将需要入队的元素放入入队栈,当做第二次出队操作的时候,需要先检查入队栈中是否还有元素,如果有元素,需将入队栈的剩余元素先放入出队栈,然后将需要出队的元素放入出队栈,后面的操作和第二次的操作一样,以此类推。

实现代码如下:

//栈模拟队列
class MyQueue<E>{
	private Stack<E> in=new Stack<E>();
	private Stack<E> out=new Stack<E>();
	//入队
	public void offer(E e) {
		while(!out.isEmpty()) {
			in.push(out.pop());
		}
		in.push(e);
	}
	
	//出队
	public E poll() {
		while(!in.isEmpty()) {
			out.push(in.pop());
		}
		return out.pop();
	}
	//判断队列是否为空
	public boolean isEmpty() {
		return in.size()==0&&out.size()==0;
	}
}

测试类如下:

public class Stack05 {
	public static void main(String[] args) {
		MyQueue<String> queue=new MyQueue<String>();
		queue.offer("A1");
		queue.offer("A2");
		queue.offer("A3");
		queue.offer("A4");
		System.out.println(queue.poll()+"出队");
		queue.offer("A5");   //入队新元素
		System.out.println(queue.poll()+"出队");
		//遍历
		while(!queue.isEmpty()) {
			System.out.println(queue.poll());
			}
	    }
	}

运行结果如下:

A1出队
A2出队
A3
A4
A5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值