在完成本题目前,首先让我们回顾一下队列和栈各自的存储特点和常用方法:
(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