java之“用栈Stack模拟队列Queue”

目录

前言

实现思路

实现代码

总结


前言

        队列(Queue)的特点是先进先出(FIFO : Fitst In First Out),而栈(Stack)的特点是后进先出(FILO : Fitst In Last Out)二者的操作特点完全不同。

实现思路

        首先,我们应该创建一个类MyQueue,这个类一定要有两个最重要的方法,offer()将元素入队,poll()将元素取出。由于栈的特点是先进后出,因此一个栈是无法实现队列先进先的特点的。

        我们可以在MyQueue中创建两个栈,元素入队栈“in”,元素出队栈“out”。当向MyQueue中第一次添加一个或者多个“A,B,C,D”元素时,可直接将元素加入到“in”中,即实现了元素入队MyQueue

       当我们要取出元素时,显然不能从“in”栈里面取,因为此时取出元素的顺序为“D,C,B,A”,我们可以把“in”栈中的元素再“倒入”栈“out”中,此时就会有这样一个效果:

       显然,现在元素出栈“out”,即是我们想要的元素出 队列MyQueue,如果我们只让部分元素出队列,比如只让“A”出队列。然后让元素“E”入队,此时“in”中为空,而out中还有“B,C,D”,:

         所以我们应该将out中的元素再次倒入“in”中,然后再让元素“E”入栈“in”即实现“E”入队MyQueue:

                

同理,之后再让元素出队MyQueue,则继续将“in”中的元素“倒入” “out”中,让元素出栈“out”,即可实现元素出队MyQueue。总之,实现元素进出队列“MyQueue”,是让元素在“in”和“out”中来回“倒”后完成的,二者相当于是两只“水杯”,哈哈!

    我们可以再给MyQueue提供判断队列是否为空的方法。只要判断栈“in”和栈“out”中的元素为空,那么队列即为空。有了这个方法,就可以遍历队列MyQueue了。

实现代码

public class Demo {
	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");
		while(!queue.isNull()) {
			System.out.println(queue.poll());
		}
	}
}

class MyQueue<E> {
	private Stack<E> in= new Stack<E>(); //入堆栈
	private Stack<E> out= new Stack<E>(); //出队栈
	
	public  boolean isNull() {//判断队列是否为空
//		return in.isEmpty()&&out.isEmpty();
		return in.size()==0&&out.size()==0;
	}
	// 入队方法
	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();
	}
}

总结

用栈模拟队列需要两个栈,“in和out”,当向队列中添加元素时,要让“out”栈为空,即把元素都放入“in”栈中后,再添加元素,当元素从队列中出队时,要让“in”栈中元素为空。即把所有元素都放入“out”栈中,然后在元素出队。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磨剑斩秋招

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值