两个队列,inputQueue和outputQueue。其中inputQueue用于入栈操作时存放元素,outputQueue用于辅助出栈操作。
例如,入栈元素01234,在inputQueue中存放01234,出栈时,将0123转移到outputQueue,此时inputQueue只剩元素4,4出栈后,将outputQueue中的0123在转移到inputQueue中。
public class StackByTwoQueues<T> {
/**
* inputQueue:入栈所用队列,outputQueue:出栈用于转移先入栈的元素
*/
private static Queue inputQueue = new Queue();
private static Queue outputQueue = new Queue();
/**
* 入栈操作
* @param item 入栈元素
* @return 返回入栈的元素
*/
private static int push(int item){
return inputQueue.offer(item);
}
/**
* 栈顶元素出栈操作
* @return 返回栈顶元素
*/
private static int pop(){
//栈中没有元素,抛出异常
if (inputQueue.size() == 0){
throw new IndexOutOfBoundsException("stack is empty");
}
//除了最后入栈的元素,将其他元素转移到outputQueue
outCopy(outputQueue,inputQueue);
//获取最后入栈元素
int item = inputQueue.pop();
//将outputQueue中的所有元素转移到inputQueue中
inCopy(inputQueue,outputQueue);
return item;
}
/**
* 栈顶元素出栈时所做的转移操作,
* 除了最后入栈的元素,将其他元素从inputQueue转移到outputQueue
* @param dest outputQueue
* @param src inputQueue
*/
private static void outCopy(Queue dest,Queue src){
while (src.size() > 1){
dest.offer(src.pop());
}
}
/**
* 栈顶元素出栈后所做的转移操作,将所有元素从outputQueue转移到inputQueue
* @param dest inputQueue
* @param src outputQueue
*/
private static void inCopy(Queue dest,Queue src){
while (src.size() > 0){
dest.offer(src.pop());
}
}
private static int size(){
return inputQueue.size();
}
public static void main(String[] args) {
System.out.print("入栈元素:");
for (int i = 0;i<5;i++){
System.out.print(push(i));
}
System.out.println();
System.out.println("出栈:");
System.out.println(pop());
System.out.println(pop());
System.out.println(pop());
System.out.println("入栈元素:" + push(20));
System.out.println("入栈元素:" + push(21));
System.out.println("遍历出栈:");
while (size() > 0){
System.out.println(pop());
}
}
}
运行效果
入栈元素:01234
出栈:
4
3
2
入栈元素:20
入栈元素:21
遍历出栈:
21
20
1
0
Queue类
public class Queue {
private LinkedList<Integer> queue;
public Queue() {
this.queue = new LinkedList<>();
}
public int offer(int item){
queue.offer(item);
return item;
}
public int pop(){
return queue.pop();
}
public int size(){
return queue.size();
}
}