两个栈实现一个队列
入队时,将元素压入s1。
出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
package jichu;
import java.util.Stack;
public class ZhanDui {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
/*
* 队列的数据压入过程
*/
public void push(Integer element){
stack1.push(element);
}
/*
* 队列的数据弹出过程
*/
public Integer 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){
//e.printStackTrace();
}
}
Integer head = stack2.pop();
return head;
}
public static void main(String[] args) {
ZhanDui sq = new ZhanDui();
sq.push(1);
sq.push(3);
sq.push(5);
sq.push(4);
sq.push(2);
System.out.println(sq.pop());
System.out.println(sq.pop());
sq.push(7);
System.out.println(sq.pop());
}
}
2.队列实现栈
(一)两个队列实现一个栈:
两个队列添加元素,哪个队列为空,由于在输出元素时,要进行相应元素的移动(除去尾部元素),所以要在对应不为空的队列进行元素的添加;在输出数据时,要进行两个队列的变相操作,不为空的队列要依次向为空的队列中添加元素,直到尾元素输出即可!
package jichu;
import java.util.ArrayDeque;
import java.util.Queue;
public class DuiZhan {
Queue<Integer> q1=new ArrayDeque<Integer>();
Queue<Integer> q2=new ArrayDeque<Integer>();
public void push(int a){
//两个队列都为空时,优先考虑 queue1
if(q1.isEmpty()&&q2.isEmpty()){
q1.add(a);
return;
}
//如果queue1为空,queue2有数据,直接放入queue2
if(q1.isEmpty()){
q2.add(a);
return;
}
//如果queue2为空,queue1有数据,直接放入queue1中
if(q2.isEmpty()){
q1.add(a);
return;
}
}
public int pop() throws Exception {
if(q1.isEmpty()&&q2.isEmpty()){
throw new Exception("空队列");
}
//如果queue2中没有元素,queue1中有元素,将其queue1中的元素依次放入queue2中,直到最后一个元素,弹出即可
if(!q1.isEmpty()){
while(q1.size()>1){
q2.add(q1.poll());
}
return q1.poll();
}
//如果queue1中没有元素,queue2中有元素,将其queue2中的元素依次放入queue1中,直到最后一个元素,弹出即可
if(!q2.isEmpty()){
while(q2.size()>1){
q1.add(q2.poll());
}
return q2.poll();
}
return -1;
}
public static void main(String args[]) throws Exception {
DuiZhan dz=new DuiZhan();
dz.push(1);
dz.push(2);
dz.push(3);
dz.push(4);
System.out.println(dz.pop());
System.out.println(dz.pop());
}
}