您的位置:首页 > 编程语言 > Java开发

java---用两个栈实现队列&&用两个队列实现栈

2015-11-06 11:03 525 查看

(1)用两个栈实现队列

Java代码

public class QueueImplementByTwoStacks<E> {

private Stack<E> stack1;//专门用来入队
private Stack<E> stack2;//专门用来出队
//队列初始化
QueueImplementByTwoStacks()
{
stack1 = new Stack<E>();
stack2 = new Stack<E>();
}

public int theSize(){return stack1.size()+stack2.size();}

public void appendTail(E e){ stack1.add(e);}

public E deleteHead() throws Exception{

//move stack1 to stack2
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
if(stack2.isEmpty()){throw new Exception("Queue is empty!");}
return stack2.pop();
}
}


(2)用两个队列实现栈

java 代码

注释:pop()方法中的return element;不能写成return queue1.poll();的原因在:/article/11216714.html

import java.util.PriorityQueue;
import java.util.Queue;

public class StackImplementByTwoQueues <E>{

private PriorityQueue<E> queue1 = new PriorityQueue<>();
private PriorityQueue<E> queue2= new PriorityQueue<>();
private int size;

//因为java中的Queue是一个接口interface不是一个类class,所以不能创建对象,可以直接拿来使用。
//  StackImplementByTwoQueues (){
//      queue1 = new Queue();
//      queue2 = new Queue();
//  }

public int theSize(){ return size; }
public boolean isEmpty(){return size==0;}

//入栈
public void push(E e){
queue1.add(e);
size++;
}
/**
* 出栈有两种思路: 思路(1):每次拷贝都是将源队列中的全部元素拷贝到目的队列中去,只由一个队列(队列1或者队列2)实现出栈。
*              思路(2):每次拷贝结束后,源队列都留有最后一个元素,用于出栈。
*/

/*  //出栈方法1:思路(1)
public E pop(){
//1.先将队列1中的前queue1.size()-1个元素压入队列2中
int queue1_Length = queue1.size();//先保存长度,因为队列元素在拷贝时,发生变化。循环的次数也在变化而产生错误。
for(int i=0;i<queue1_Length-1;i++) {
E e = queue1.poll();//删除队头的元素,并返回。
queue2.add(e);
}

//2.保存队列1中的最后一个元素
E element = queue1.poll();

//3.再将队列2中的所有元素压入队列1中。
int queeu2_Length = queue2.size();
for(int j =0;j<queeu2_Length;j++){queue1.add(queue2.poll());}
size--;
return element;

}*/

//出栈方法2:思路(2)
public E pop(){

E element = null;
if(!queue1.isEmpty()&&queue2.isEmpty()){
//1.将队列1中除最后一个元素之外的全部元素压入队列2中。
int queue1_Length = queue1.size();//先保存长度,因为队列元素在拷贝时,发生变化。循环的次数也在变化而产生错误。
for(int i=0;i<queue1_Length-1;i++) {
E e = queue1.poll();//删除队头的元素,并返回。
queue2.add(e);
}
//2.保存队列1中的最后一个元素
element = queue1.poll();
}
else if(queue1.isEmpty()&&!queue2.isEmpty()){

//1.再将队列2中除最后一个元素之外的全部元素压入队列1中。
int queeu2_Length = queue2.size();
for(int j =0;j<queeu2_Length-1;j++){queue1.add(queue2.poll());}
//2.保存队列2中的最后一个元素
element = queue2.poll();
}
size--;
return element;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: