单队列模拟栈
- 队列Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序集合。
- 栈Stack实际上是实现了一个后进先出(LIFO:Last In First Out)的有序集合。
实现思路:当我们往队列中添加元素时,先添加的元素始终会先出队列,那么如果将添加的元素item之前的元素们都依次拿出来再添加到当前队列中,那么此item就会存入到队列的尾部,从而刚好实现了栈后进先出的特点。
class MyStack3<E>{
private Queue<E> queue;
private int size =0;//记录队列元素个数
public MyStack3() {
queue= new LinkedList<>();
}
// 入栈
public void push(E item) {
queue.offer(item); //先入队,然后改变其顺序
//根据元素个数size,循环几次(相当于把前多少个元素拿出来再放回去)
for (int i = 0; i <size ; i++) {
queue.offer(queue.poll()); //将item之前的元素全部放在队列的尾部
}
size++;
}
// 出栈
public E pop() {
return queue.poll();
}
// 判空
public boolean isEmpty() {
return queue.isEmpty();
}
//取栈顶
public E top() {
return queue.peek();
}
}
测试代码
// 单队列模拟栈
MyStack3<String> stack = new MyStack3<String>();
stack.push("A1");
stack.push("A2");
stack.push("A3");
stack.push("A4");
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}