Java中栈实现队列

在完成本题目前,首先让我们回顾一下队列和栈各自的存储特点和常用方法:

(1)队列queue

①存储特点:

先进先出 frist in,first out ;

只能从队尾添加元素(入队),队首取出元素(出队)

②相关方法:

element() \ peek()   获取队首元素,但不取出

 remove() \ poll()     获取队首元素并取出

add()   \  offer()       向队尾添加元素

 (2)栈stack       

 ①存储特点:

    后进先出   last in,first out;

    只能从栈顶入栈和出栈

  ②常用方法:

   push() 向栈顶添加元素(入栈)

   pop()   取出栈顶元素(出栈)

   peek()获取栈顶元素,但不取出

本题思路分析: 

栈实现队列,需要充分理解两者各自的存储特点,栈:后进先出;队列:先进先出;我们很容易想到可以先将数据全部存储在一个栈中,然后依次取出数据再放入另一个栈中,再从该栈中取出数据的方式来模拟队列。

具体实现:

自定义一个Myqueue队列类,在该类中声明两个栈类型的成员变量in(入队栈)和out(出队栈),并且声明入队的方法offer()、出队方法poll()以及队列判空的方法isEmpty()等相关方法。

①入队方法offer()的实现思路: 在每次将元素添加到入队栈之前,先判断出队栈是否为空,若不为空,先将出堆栈中的元素依次出栈并压入入队栈中,然后再在入堆栈中添加需要添加的元素。

②出队方法poll()的实现思路:元素出队即从出队栈中取出栈顶元素,先判断入队栈是否为空,若不为空,先将入堆栈中的元素依次出栈并压入出队栈中,然后再从出队栈中取出栈顶元素。

③判空isEmpty()方法的实现思路:判断自定义队列是否为空可以通过判断入堆栈和出堆栈的长度是否为零来实现。

import java.util.Stack;

/*栈实现队列*/
public class Myqueue <E>{

	private Stack<E> in=new Stack<>();    //入队栈
	private Stack<E> out=new Stack<>();  //出队栈
	
	//入队方法
	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 Myqueuetest {
	public static void main(String[] args) {
		Myqueue<String> queue=new Myqueue<String>();
		queue.offer("A");
		queue.offer("B");
		queue.offer("C");
		queue.offer("D");
		queue.offer("E");
		System.out.println(queue.poll());
		while(!queue.isEmpty()) {
			System.out.print(queue.poll()+" ");
			
		}
	}
}
//结果:

A
B C D E 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值