您的位置:首页 > Web前端

剑指offer之两个栈模拟队列操作

2015-09-04 09:44 281 查看
队列的特点是先进先出,而栈的特点是先进后出

所以当用两个栈模拟队列的时候,为了依然保持队列的特点,可以将一个栈作为主栈,一个栈作为备用栈

当执行“入队”的时候,可以直接进入主栈;

当执行“出对”的时候,可以先将主栈元素依次push进备用栈直到主栈剩余一个元素(即是要出队的元素)

import java.util.Stack;

public class Solution {
//主栈
Stack<Integer> stack1 = new Stack<Integer>();
//备用栈
Stack<Integer> stack2 = new Stack<Integer>();

public void push(int node) {
stack1.push(node);
}

public int pop() {
if(stack1.isEmpty()){
return 0;
}
while(stack1.size() > 1 ){
stack2.push(stack1.pop());
}
int tmp = stack1.pop();
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
return tmp;
}
}


但是还是有问题的?问题在于执行“出队”时,都要先腾挪到备用栈,执行完再腾挪回主栈。那么是不是多此一举呢?显然,我们可以发现当腾挪到备用栈之后,备用栈的元素顺序就是出队顺序。

所以需要改进代码:

public class Solution {
//入队栈
Stack<Integer> stack1 = new Stack<Integer>();
//出队栈
Stack<Integer> stack2 = new Stack<Integer>();

public void push(int node) {
stack1.push(node);
}

public int pop() {
//出队栈空,需要将入队栈腾挪到出队栈
if(stack2.isEmpty()){
if(stack1.isEmpty()){
return 0;
}
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: