今天在复习数据结构时候,看到栈和队列这一章,有两个很有意思的问题,
1 如何使用两个栈来实现一个队列
2 如何使用两个队列来实现一个栈
思想都比较简单,简而言之就是两边儿来回倒
附两张图即可说明
接下来 记录一下这两个功能的java代码实现
首先是两个栈 实现一个队列
package learnstack;
import java.util.Stack;
/*
* 本程序计划使用两个栈来实现一个队列 栈 先进后出 队列先进先出 怎么结合两个栈呢? 压进去弹到另一个栈中就好
*/
public class test {
Stack<Integer> stack1=new Stack <Integer>();
Stack<Integer> stack2=new Stack <Integer>();
public void push(int node){
stack1.push(node);
}
public int pop(){
if(stack2.size()<=0){
while(stack1.size()>0){
stack2.push(stack1.pop());
}
}
if(stack2.isEmpty()){
try{
throw new Exception("queue is empty");
}catch (Exception e){
}
}
int head =stack2.pop();
return head;
}
public static void main(String[] args){
test test1=new test();
test1.push(0);
test1.push(1);
test1.push(2);
System.out.println(test1.pop());
System.out.println(test1.pop());
System.out.println(test1.pop());
}
}
在程序中压入0 1 2 输出结果自然是0 1 2咯
接着来记录一下两个队列实现一个栈
package learnstack;
import java.util.Queue;
import java.util.ArrayDeque;
/*
* 本程序使用两个队列实现一个栈 队列先进先出 栈后进先出 左右队列来回倒
*/
public class test2 {
Queue<Integer> queue1= new ArrayDeque<>();
Queue<Integer> queue2= new ArrayDeque<>();
public void push(int node){
if(queue1.isEmpty()&&queue2.isEmpty()){
queue1.add(node);
return;
}
if(queue1.isEmpty()){
queue2.add(node);
return;
}
if(queue2.isEmpty()){
queue1.add(node);
return;
}
}
public int pop(){
if (queue1.isEmpty()&&queue2.isEmpty()) {
try {
throw new Exception("stack is empty");
} catch (Exception e) {
}
}
if(queue1.isEmpty()){
while(queue2.size()>1){
queue1.add(queue2.poll());
}
return queue2.poll();
}
if(queue2.isEmpty()){
while(queue1.size()>1){
queue2.add(queue1.poll());
}
return queue1.poll();
}
return (Integer)null;
}
public static void main(String[] args){
test2 t2=new test2();
t2.push(1);
t2.push(2);
t2.push(3);
t2.push(4);
System.out.println(t2.pop());
System.out.println(t2.pop());
}
}
压入的参数是1 2 3 4 显示两个结果 则 输出结果为 4 3 后进先出嘛!