您的位置:首页 > 职场人生

剑指Offer---面试题:使用两个栈实现队列

2016-11-29 15:28 246 查看
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:

首先,应该明确栈和队列的特性.

栈是先进后出表

队列是先进先出表

我们可以这样设想:

1.
push
操作,我们将元素压入
stack1
;

2.
pop
操作,我们将
stack1
里面的所有元素都出栈,然后依次压入
stack2
;

这样一来,原先第一个压入
stack1
里面的元素(假设是Integer类型的1),此时就在
stack2
的栈顶,此时进行出栈操作就是将1出栈.这样一来,就满足了队列的性质,先进先出.

写这道题目的时候,一开始就只想到上述情况,于是三分钟就搞定了.代码如下:

import java.util.Stack;
import java.util.Iterator;

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() {
Iterator<Integer> iterator1 = stack1.iterator();
while (iterator1.hasNext()) {
stack2.push(stack1.pop());
}
return stack2.pop();
}
}


测试时候发现,并不是所有情况下,都可以完美的通过测试数据.具体来说

push
操作次数大于
pop
操作次数时候
就会出错.

这是因为当两者次数不相等的时候,在
stack2
中,会存在上次一
pop
操作所剩余下来的元素,该元素在下一次
pop
操作时,应该首先出栈,但是上述代码没有对这种情况进行处理.

正确的姿势应该是:

push
操作执行之后,应该检查
stack2
中是否存在元素,如果存在,则将其全部压入
stack1
中.然后,再压入方法实参.

正确代码:

import java.util.Stack;
import java.util.Iterator;

public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();

public void push(int node) {
Iterator<Integer> iterator2=stack2.iterator();
while(iterator2.hasNext()){
stack1.push(stack2.pop());
}
stack1.push(node);

}

public int pop() {
Iterator<Integer> iterator1 = stack1.iterator();

while (iterator1.hasNext()) {
stack2.push(stack1.pop());
}

return stack2.pop();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: