一、两个栈实现一个队列
思想:
入队:直接加入stack1中
出队:若stack2中有元素,则直接出栈,否则将stack1中全部元素依次出栈加入stack2,然后stack2出栈一个元素
若stack1和stack2中都没有元素,则提示空!
1 public class StackQueue { 2 3 Stack<Integer> stack1 = new Stack<Integer>(); 4 Stack<Integer> stack2 = new Stack<Integer>(); 5 //相当于入队操作 6 public void push(int node){ 7 stack1.push(node); 8 } 9 //相当于出队操作 10 public int pop(){ 11 //stack1和stack2都为空 12 if(stack1.isEmpty() && stack2.isEmpty()){ 13 try{ 14 throw new Exception("satck is empty!"); 15 }catch(Exception e){ 16 e.printStackTrace(); 17 } 18 System.out.println("stack is empty!"); 19 } 20 //stack2为空情况 21 if(stack2.empty()){ 22 while(!stack1.empty()) 23 stack2.push(stack1.pop()); 24 } 25 //有元素出队返回 26 return stack2.pop(); 27 28 }
二、两个队列实现一个栈
思想:
入栈:两个队列必有一个是空的,入栈时选择空队列进入
出栈:将非空队列中的元素依次出队并添加到另一个队列中,剩余最后一个时则出队并输出。
若两队列都为空,则提示为空。
1 ublic class QueueStack 2 { 3 //ArrayDeque集合是Deque接口的实现类,它是一个基于数组的双端队列 4 Queue<Integer> queue1 = new ArrayDeque<>(); 5 Queue<Integer> queue2 = new ArrayDeque<>(); 6 7 //向栈压入数据 8 public void push(Integer node){ 9 10 //两个队列都为空时,优先考虑 queue1 11 if(queue1.isEmpty()&&queue2.isEmpty()){ 12 queue1.add(node); 13 return; 14 } 15 //如果queue1为空,queue2有数据,直接放入queue2 16 if(queue1.isEmpty()){ 17 queue2.add(node); 18 return; 19 } 20 //如果queue2为空,queue1有数据,直接放入queue1中 21 if(queue2.isEmpty()){ 22 queue1.add(node); 23 return; 24 } 25 } 26 //从栈弹出数据 27 public Integer pop(){ 28 //如果两个队列都为空,则抛出异常 29 if(queue1.isEmpty()&&queue2.isEmpty()){ 30 try{ 31 throw new Exception("stack is empty"); 32 }catch (Exception e){ 33 e.printStackTrace(); 34 } 35 } 36 //如果queue1为空,queue2不为空,则将queue2中的元素依次出队到queue2,直到最后一个输出 37 if(queue1.isEmpty()){ 38 while (queue2.size() > 1){ 39 queue1.add(queue2.poll()); 40 } 41 return queue2.poll(); 42 } 43 //如果queue2为空,queue1不为空,则将queue1中的元素依次出队到queue1,直到最后一个输出 44 if(queue2.isEmpty()){ 45 while (queue1.size() > 1){ 46 queue2.add(queue1.poll()); 47 } 48 return queue1.poll(); 49 } 50 return null; 51 }