题目描述
如何用栈结构实现队列的push和pop操作。
队列和栈的概念
队列:先进先出,从头进,从尾出。
栈:先进后出,从头进,从头出。
解题思路
一个栈是无法完成队列的,本题我们可以通过两个栈来实现,一个栈专门用来添加元素,另一个栈专门用来取出元素。
假设分别设添加元素的栈为:A,取元素的栈为:B。
每次数据都push到A栈中,当需要pop时,如果B栈为空,则一次性把用来A栈数据全部弹出并添加到B栈,否则直接从B栈弹出,这样即实现了队列的操作。
图解分析
1、假设现在要添加了3个元素,分别为:1,2,3
2、现在需要弹出一个元素,首先判断B栈是否为空,此时B栈是为空的,那么则一次性把A栈数据全部弹出到B栈。
3、然后从B栈弹出一个元素,就是1(1是先进的,现在也先出了,符合队列结构)。
4、此时如果又需要添加一个元素4,则继续向A栈添加。
5、当再又元素要弹出时,因为B栈不为空,所以直接从B栈弹出。
扫描二维码关注公众号,回复:
12894477 查看本文章
代码实现
import java.util.Stack;
public class Code_StackImplQueue<E> {
Stack<E> stack_a = new Stack<>();
Stack<E> stack_b = new Stack<>();
public static void main(String[] args) {
Code_StackImplQueue c = new Code_StackImplQueue();
c.push(1);
c.push(2);
c.push(3);
System.out.println("push: 1,2,3");
System.out.println("pop:" + c.pop() + "," + c.pop() + "," + c.pop());
}
/**
* 每次push元素时都push到stack_a栈中
*
* @param e
*/
public void push(E e) {
stack_a.push(e);
}
public E pop() {
/**
* 如果stack_b为空,则需要把stack_a的元素全部弹出并push到stack_b中
*/
if (stack_b.empty()) {
while (!stack_a.empty()) {
stack_b.push(stack_a.pop());
}
}
//如果stack_b还为空,则表示stack_a也为空,则直接返回null
if (stack_b.empty()) {
return null;
}
//从stack_b取出元素
return stack_b.pop();
}
}