题目描述:用两个栈实现一个队列。分别完成在队列尾部插入结点和在队列头部删除结点的功能。
基本知识:
(1)队列的操作:
offer:队尾插入元素,插入失败返回false。
poll:队头取出元素
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
(2)实现栈的操作:
push:向栈中压入元素。
pop:从栈顶弹出元素。
主要思路:
经过两个栈之后,就是一个队列。插入元素在栈1中,当栈2为空时,就从栈1中依次取出全部的元素压入栈2,取元素是从栈2中取。
public class MyQueue<T> {
private Stack<T> stack1;
private Stack<T> stack2;
public MyQueue(){//泛型的构造函数原来和普通类一样?
stack1=new Stack<T>();
stack2=new Stack<T>();
}
//队尾插入
public void add(T item) {
stack1.push(item);
}
//队头删除
public T delete() {
if(stack2.isEmpty()){//当栈2为空时,就从栈1中依次取出全部数据压入栈2中
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
if(!stack2.isEmpty())
return stack2.pop();
else
return null;
}
}
扩展:用两个队列实现一个栈
主要思路:
新push进来的元素总是插入到非空队列中,空队列则用来保存较老的元素,较新的元素则弹出,每pop一次产生一个空队列。
代码:
public class MyStack<T> {
private Queue<T> queue1;
private Queue<T> queue2;
public MyStack(){
queue1=new LinkedList<T>();
queue2=new LinkedList<T>();
}
//向栈中压入元素。因为两个队列至少有一个是空的,要将元素插入非空队列中。
public void push(T item){
if(!queue2.isEmpty())
queue2.offer(item);
else
queue1.offer(item);
}
// 弹出栈顶元素,因为要弹出最新的那个,所以返回的是最后插入的那个元素,且每一次pop都会将一个队列变空。
public T pop() {
if (!queue1.isEmpty()) {
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
return queue1.poll();
}
if (!queue2.isEmpty()) {
while (queue2.size() > 1) {
queue1.offer(queue2.poll());
}
return queue2.poll();
}
return null;
}
}