【每天学点算法题10.20】用两个栈实现队列

题目描述:用两个栈实现一个队列,完成队列在尾部插入结点和在头部删除结点的功能。


问题解决:我们知道,栈的特点是“后进先出”,队列的特点是“先进先出”。题目的意图就是让我们操作两个“后进先出”的栈来实现一个“先进先出”的队列。现在我们只要用这两个栈实现队列的出队和入队功能就好了。现在有两个栈stack1和stack2。(1)入队:将元素插入到stack1中,stack2保持为空。(2)出队:出队的顺序应该从第一个入队的元素开始,但是它并不在栈的栈顶上,不能直接出队。现在注意到stack2我们还没使用过,我们将元素逐个弹出并压入stack2,元素在stack2中的顺序正好和stack1中相反,最先入队的元素正好就在栈顶上,就可以弹出stack2的栈顶元素了,并将其保存在一个链表中。


由此我们可以总结到:如果stack2不为空时,stack2中的栈顶元素就是最先入队的元素,可以弹出。当stack2为空时,我们可以将stack1中的元素逐个弹出压入stack2.由于入队的时候,先入队的元素在stack1的底端,现在弹出压入到stack2之后就在顶端了,可以弹出。


java示例代码如下:


import java.util.*;
/**
  @author dyoyo90
  @用两个栈实现队列
  */
public class StacksImplementQueue{
private Stack<Integer> stack1;
private Stack<Integer> stack2;
StacksImplementQueue(){
stack1=new Stack<Integer>();
stack2=new Stack<Integer>();
}
//pop one element
public Integer poll(){
Integer re=null;
if(!stack2.empty()){
re=stack2.pop();
}
else{
while(!stack1.empty()){
re=stack1.pop();
stack2.push(re);
}
if(!stack2.empty()){
re=stack2.pop();
}
}
return re;
}
//push one element
public Integer offer(int o){
stack1.push(o);
return o;
}

//a test
public static void main(String[] args){
StacksImplementQueue queue=new StacksImplementQueue();
List<Integer> re=new ArrayList<Integer>();
queue.offer(1);
queue.offer(2);
queue.offer(3);
re.add(queue.poll());
queue.offer(4);
re.add(queue.poll());
queue.offer(5);
re.add(queue.poll());
re.add(queue.poll());
re.add(queue.poll());
Iterator<Integer> it=re.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值