1.栈的特点:先进后出
2.队列的特点:先进先出
3.此时我们用两个栈来实现队列,那么我们让其中一个栈作为队列的入口,负责插入新元素,另一个栈作为队列的出口,负责移出老元素.
4.队列的主要功能无非就两个:出队/入队;
在模拟入操作是,我们把新元素压如栈A中,
让元素1入队:
让元素2入队:
让元素3入队:
这时候我们需要让元素1出队,操作如下:
让栈A中元素依次出栈,并按照出栈的顺序依次入栈到栈B中,这样一来栈A弹出并压如栈B的顺序是321,刚好和原来栈A中的顺序123相反.
此时让元素1出队,也就是让元素1从栈B中出栈:
让元素2出队同理:
若此时想做入队操作,即将想入队的元素4压如栈A中
此时元素3可出队,若元素4要继续出队则像刚才一样将栈A的元素按照出栈顺序压入到栈B中,即可继续出队.
代码实现如下:
package com.canglang.algorithm.queue;
import java.util.Stack;
/**
* @author leitao.
* @category
* @time: 2018/10/22 0022-10:13
* @version: 1.0
* @description: 用栈实现队列
**/
public class StackQueue {
private Stack<Integer> stackA = new Stack<Integer>();
private Stack<Integer> stackB = new Stack<Integer>();
/**
* 入队操作
* @param element 入队元素
*/
public void enQueue(int element){
stackA.push(element);
}
/**
* 出队操作
* @return
*/
public Integer deQueue(){
if (stackB.isEmpty()){
if (stackA.isEmpty()){
return null;
}
transfer();
}
return stackB.pop();
}
/**
* 栈A元素转移到栈B
*/
private void transfer() {
while (!stackA.isEmpty()){
stackB.push(stackA.pop());
}
}
public static void main(String[] args){
StackQueue stackQueue = new StackQueue();
stackQueue.enQueue(1);
stackQueue.enQueue(2);
stackQueue.enQueue(3);
System.out.println(stackQueue.deQueue());
System.out.println(stackQueue.deQueue());
stackQueue.enQueue(4);
System.out.println(stackQueue.deQueue());
System.out.println(stackQueue.deQueue());
}
}