题目:利用两个队列模拟栈,分析图如下:
- abcd一次进入队列模拟进入栈;
- 进行出栈操作,表示d要出栈,根据队列的先进先出原则,只有abc依次出队列d才有机会出队列,所以abc从queue01出队列到queue02,d出队列实现出栈操作;
- 元素ef需要进栈,直接进入到queue01队列即可;
- 进行出栈操作,表示f需要出栈,此时将e出队列进去到queue02,f出队列达到出栈效果。
注:如果第五步需要进行出栈操作,则需要将queue02的元素都出队列到queue01,剩下最后一个元素e出queue02队列实现出栈操作。
代码实现如下:
package com.example.offer;
import java.util.LinkedList;
import java.util.Queue;
public class TestMyStack {
public static void main(String[] args) {
MyStack<String> myStack=new MyStack<>();
myStack.push("我");
myStack.push("爱");
myStack.push("学习");
myStack.push("吗");
myStack.pop();
myStack.pop();
myStack.push("游戏");
while (myStack.size()>0){
System.out.println(myStack.pop());
}
}
}
/**
* 利用两个队列实现栈
*/
class MyStack<T>{
private Queue queue01=new LinkedList();//用于入栈
private Queue queue02=new LinkedList();//用于出栈
/**
* 实现出栈操作:出栈操作比进栈操作麻烦点
* @return
*/
public T pop(){
//如果queue01和queue02都为空,则模拟栈中为空
if(queue01.isEmpty() && queue02.isEmpty()){
return null;
}
//如果queue01不为空,且size>1 先出队列,剩最后一个元素为要出栈的元素
while(!queue01.isEmpty()){
if(queue01.size()<=1){
return (T)queue01.poll();
}else{
queue02.offer(queue01.poll());
}
}
//如果queue01为空queue02不为空 则将queue2的元素出队列,进到queue01 剩最后一个元素为需要出栈的元素
if(queue01.isEmpty() && !queue02.isEmpty()){
while(!queue02.isEmpty()){
if(queue02.size()<=1){
return (T)queue02.poll();
}else{
queue01.offer(queue02.poll());
}
}
}
return null;
}
/**
* 实现入栈操作
*
* @param node
*/
public void push(T node){
queue01.offer(node);
}
/**
* 模拟栈的大小
* @return
*/
public int size(){
return queue01.size()+queue02.size();
}
}