数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈
今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列。可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归。那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题。
一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出。
public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void add(int num){ s1.push(num); } //删除 public void delete(){ //判断s2是否有值 if(s2.size() > 0){ s2.pop(); }else{ //先把s1里面的内容加入s2 for(int i = 0;i < s1.size() - 1;i++){ s2.push(s1.pop()); } //把s1剩下的一个节点直接弹出就行 s1.pop(); } } }
两个栈模拟一个队列的思路和算法还是比较简单的,只需要注意细节就行,别让自己的算法出错。
二:用两个队列模拟一个栈:
1 public class MyQueue(){ 2 //声明两个模拟的队列 3 Queue<Integer> q1 = new ArrayDeque<>(); 4 Queue<Integer> q2 = new ArrayDeque<>(); 5 //添加操作 6 public void push(int num){ 7 //判断两个队列是否都为空 8 if(q1.isEmpty() && q2.isEmpty()){ 9 //优先考虑q1执行增加操作 10 q1.offer(num); 11 }else if(q1.isEmpty()){ 12 q2.offer(num); 13 }else{ 14 q1.offer(num); 15 } 16 } 17 //删除操作 18 public int pop(){ 19 if(q1.isEmpty() && q2.isEmpty()){ 20 throw new Expection("空栈无数据弹出"); 21 }else if(q1.isEmpty()){ 22 for(int i = 0;i < q2.size() - 1;i++){ 23 q1.offer(q2.poll); 24 } 25 return q2.poll(); 26 }else{ 27 for(int i = 0;i < q1.size() - 1;i++){ 28 q2.offer(q1.poll); 29 } 30 return q1.poll(); 31 } 32 } 33 }
队列模拟栈也好,栈模拟队列也罢,其实无非就是抓住队列先进先出,栈后进先出的特点然后进行实现他们的增加删除操作。但是在这个过程中注意自己的严谨性很重要。