一 栈
由于栈是先进后出,所以使用栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈,栈的示意图如下。
栈中两个最重要的操作是PUSH和POP,两个是相反的操作。
PUSH:在堆栈的顶部加入一 个元素。
POP:在堆栈顶部移去一个元素, 并将堆栈的大小减一。
二 队列
队列也是一种特殊的线性表。不同于栈所服从的先进后出的原则,队列的原则是先进先出,队列在队头做删除操作,在队尾做插入操作。队列的示意图如下。
三 实现逻辑
那么接下来,我们如何借助两个栈来实现队列呢,
我们目前拥有两个栈A 和 栈B, 我们可以让栈A作为队列的入口,而 栈B作为队列的出口即可,
每次入栈的时候,即push都进入栈A 中,pop的时候,先判断栈B是否为空,如果栈B不为空,则直接栈B 出栈数据,如果栈B为空,判断栈A是否为空,如果也为空,说明此时队列中无任何数据,若栈A不为空,则按照栈A出栈顺序压入栈B中,然后栈B出栈数据即可。简单流程图如下。
进队列示意图如下
出队列示意图如下
四 实现代码
public class MainUseStackImplementQueue {
Stack<Integer> stackA = new Stack<Integer>();
Stack<Integer> stackB = new Stack<Integer>();
public static void main(String[] args) {
MainUseStackImplementQueue mq = new MainUseStackImplementQueue();
mq.push(1);
mq.push(2);
mq.push(3);
System.out.println(mq.pop());
mq.push(4);
System.out.println(mq.pop());
}
public void push(int node) {
stackA.push(node);
}
public int pop() {
if(!stackB. isEmpty ()){
return stackB.pop();
}
while (!stackA.isEmpty()){
stackB.push(stackA.pop());
}
//如果两个栈中都为空 返回0 避免异常
if(stackB.isEmpty()){
return 0;
}
return stackB.pop();
}
}