本文共 1394 字,大约阅读时间需要 4 分钟。
如何用栈结构实现队列的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栈弹出。import java.util.Stack;public class Code_StackImplQueue{ Stack stack_a = new Stack<>(); Stack 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(); }}
转载地址:http://yqlrb.baihongyu.com/