需求:
堆栈特点是先进后出,队列特点是先进先出。二者有一定联系,可以使用两个队列实现堆栈,也可以用两个堆栈实现队列。
分析:
1、两个堆栈实现队列(有两个堆栈stack1,stack2)
添加:添加到stack1中
删除队列头部元素:如果两个堆栈都是空的,那么抛出异常。如果stack2非空,将栈顶pop,如果stack2是空的,判断stack1大小是否是1,如果是1,那么直接pop返回栈顶元素即可,如果不是就把stack1元素pop到stack2中,然后pop返回stack2栈顶元素即可
2、两个队列实现堆栈(有两个队列queue1,queue2)
添加:添加到非空的队列中,如果两个都是空的,添加到queue1中
删除栈顶元素:判断是否有非空队列,如果没有,抛出异常,如果有,判断非空的队列长度是否是1,如果是1,直接poll即可,如果不是1,那么需要使用poll删除队列头部,然后添加到另一个队列中,直到只剩下1个元素,该元素即为栈顶元素,poll删除返回即可
代码:
import java.util.*;
class StackQueue{
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
Queue<Integer> queue1 = new ArrayDeque<Integer>();
Queue<Integer> queue2 = new ArrayDeque<Integer>();
//堆栈实现队列添加元素
public void queuePush(int node){
stack1.push(node);
}
//堆栈实现队列删除头部元素
public int queuePop(){
//如果两堆栈都是空的,那么抛出异常
if(stack1.empty() && stack2.empty())
throw new RuntimeException("stack null!!");
//如果stack2非空,直接pop即可
if(!stack2.empty()){
return stack2.pop();
}
//如果stack2空的,就将stack1元素pop然后push到stack2中,然后pop
//如果stack1的元素只有一个,那么直接pop也可以
if(stack1.size() == 1)
return stack1.pop();
while(!stack1.empty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
//队列实现堆栈添加元素
public void stackPush(int node){
if(queue1.isEmpty() && queue2.isEmpty()){
queue1.offer(node);
}
else if(!queue1.isEmpty()){
queue1.offer(node);
}
else{
queue2.offer(node);
}
}
//队列实现堆栈删除栈顶元素
public int stackPop(){
//如果两个队列都是空的,那么抛出异常
if(queue1.isEmpty() && queue2.isEmpty()){
throw new RuntimeException("queue null!!");
}
//正常情况下应该最多有一个队列非空
//如果queue1非空
if(!queue1.isEmpty()){
//如果队列长度是1,那么直接poll即可
if(queue1.size() == 1)
return queue1.poll();
//将queue1中元素poll删除然后添加到queue2中,直到queue1元素个数是1,然后poll返回即可
while(queue1.size() > 1){
queue2.offer(queue1.poll());
}
return queue1.poll();
}
//如果queue2非空
//如果queue2长度是1,那么抛出异常
if(queue2.size() == 1)
return queue2.poll();
while(queue2.size() > 1){
queue1.offer(queue2.poll());
}
return queue2.poll();
}
}
class StackQueueDemo{
public static void main(String[] args){
StackQueue sq = new StackQueue();
//堆栈实现队列
System.out.println("向队列中添加1,2,3,4");
sq.queuePush(1);
sq.queuePush(2);
sq.queuePush(3);
sq.queuePush(4);
System.out.println("依次删除队列头部");
for(int i = 0; i < 4; i++)
System.out.println(sq.queuePop());
//队列实现堆栈
System.out.println("向堆栈中添加1,2,3,4");
sq.stackPush(1);
sq.stackPush(2);
sq.stackPush(3);
sq.stackPush(4);
System.out.println("依次删除栈顶元素");
for(int i = 0; i < 4; i++)
System.out.println(sq.stackPop());
//测试队列性能
//依次输出190,100,200
sq.queuePush(190);
sq.queuePush(100);
System.out.println(sq.queuePop());
sq.queuePush(200);
System.out.println(sq.queuePop());
System.out.println(sq.queuePop());
//测试堆栈性能
//依次输出19,20,18
sq.stackPush(18);
sq.stackPush(19);
System.out.println(sq.stackPop());
sq.stackPush(20);
System.out.println(sq.stackPop());
System.out.println(sq.stackPop());
}
}