题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
该题目,要求我们操作两个先进后出的栈实现一个先进先出的队列Queue,当要插入元素时,不妨先插入到stack1,stack2为空,当队列要弹出一个元素时,先把stack1的元素逐个弹出并压入stack2,stack2顺序和stack1正好相反,因此弹出stack栈顶的元素了,就是队列要弹出的元素。
因此总结弹出的规律是,当stack2不为空直接弹出堆顶元素,当stack2为空,我们把stack1的元素逐个弹出并压入stack2.
当插入一个元素时,由于它比stack2的元素后进队,因此可以放入stack1中。
当总结完队列插入、删除的操作过程,我们就可以写代码了。
private Stack<String> stack1 = new Stack<String>();
private Stack<String> stack2 = new Stack<String>();
public void appendTail(String s){
stack1.push(s);
}
public String deletedHead() throws Exception{
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
if(stack2.isEmpty()){
throw new Exception("队列为空,不能删除");
}
return stack2.pop();
}
用两个队列实现栈。当往栈插入元素时,由于queue1和queue都为空,则插入queue1,当继续往栈中插入元素,继续插入queue1,但栈中要弹出一个元素,根据栈的后入先出原则,后压入栈的应先弹出,那么只能把queue1中不是最后一次插入的元素,插入到queue2,再弹出queue1的元素。根据上述栈插入、弹出情况的分析,写代码。
queue1 = new LinkedList<String>();
queue2 = new LinkedList<String>();
public String pop(){
String re =null;
if(queue1.size() == 0 && queue2.size() == 0){
return null;
}
if(queue2.size() == 0){
while(queue1.size() >0){
re = queue1.removeFirst();
if(queue1.size() != 0){
queue2.addLast(re);
}
}
}else if(queue1.size() == 0){
while(queue2.size() >0){
re = queue2.removeFirst();
if(queue2.size()!=0){
queue1.addLast(re);
}
}
}
return re;
}
public String push(String str){
if(queue1.size() ==0 && queue2.size() == 0){
queue1.addLast(str);
}else if(queue1.size()!=0){
queue1.addLast(str);
}else if(queue2.size()!=0){
queue2.addLast(str);
}
return str;
}