栈模拟队列


我们先分别了解一下队列和栈结构特点

Queue队列:先进先出

队列只允许在队尾入队
队首进行出队(or删除)操作

队列入队出队操作示意图

在这里插入图片描述

Stack 栈:后进先出

入栈操作示意图

在这里插入图片描述

出栈操作示意图:

在这里插入图片描述

栈模拟队列

要用栈模拟队列,首先应该思考如何让栈去完成像队列一样“先进先出”的基本操作。栈的特点是后进先出,所以要用栈模拟队列,我们需要用两个栈,分别代表入队和出队操作,即入队栈in和出队栈out。:

栈模拟队列的入队操作:

第一步:元素入队前需要判断出队栈out是否为空栈?
第二步:如果出队栈out为空,需要入队的元素正常入队进入入队栈in。
第三步:如果出队栈out不为空,需要先让出队栈out的元素全部先进入入队栈in里,在进行元素入队操作。

栈模拟队列的出队操作:

一、和入队操作同理,出队前先要判断入队栈in是否为空栈?
二、如果入队栈in为空栈,则正常进行出队操作
三、如果如入队栈in不为空,则需要先让入队栈in的所有元素进入出队栈out后,在进行出队操作。

栈模拟队列图解

在这里插入图片描述

栈模拟队列的代码演示

public class Test01 {
	public static void main(String[] args) {
		MyQueue<String> queue1=new MyQueue<String>();
		//分别存入三个元素  存入in栈
		queue1.offer("A");
		queue1.offer("B");
		queue1.offer("C");
		//出栈的是最先存入的元素
		System.out.println(queue1.poll());
		System.out.println("----");
		queue1.offer("D");
		
		while(!queue1.isEmpty()) {
			System.out.println(queue1.poll());
		}
	}
	
	
}
class MyQueue<E>{
	
	Stack<E> in=new Stack<E>();//入队栈
	Stack<E> out=new Stack<E>();//出队栈
	//判断栈是否为空
	public boolean isEmpty() {
		return in.size()==0&&out.size()==0;//入队栈和出队栈都为空时,才返回true
	}
	//入队操作
	public void offer(E e) { 
		while(!out.isEmpty()) {//判断出队栈是否不为空
			in.push(out.pop());//不为空则将出队栈的元素全部弹入到入队栈in
		}
		in.push(e);//元素入队
		
	}
	//出队操作
	public  E poll() {
		while(!in.isEmpty()) {//判断入队栈是否不为空
			out.push(in.pop());//不为空则将所有入队栈的元素弹出存入出队栈
		}
		return out.pop();//元素出队
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值