小米三面时,面试官给出了一个算法题,题目如下:用两个栈实现一个队列的功能,如:输入1,2,3,4,5,6;输出1,2,3,4,5,6。
解题思路:输入数据时,将数据输入到栈1,输出数据时,先判断栈2中是否有数据,若有直接出栈,若无则将栈1中数据全部入栈2,之后再将栈2中数据出栈。如下图所示:
按照该思路,进行了代码线上编写,运行后发现出栈顺序是错误的,而且面试官指出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) {
//判断2是否空,若空1中数据全部入2,
if(stack2.isEmpty() && !stack1.isEmpty()) {
for(int i = 0;i<stack1.size();i++){
stack2.push(stack1.pop());
}
}
//正常入1
stack1.push(node);
}
public int pop() {
//判断2是否为空,若为空1中数据入2
if(stack2.isEmpty() && !stack1.isEmpty()) {
for(int i = 0;i<stack1.size();i++){
stack2.push(stack1.pop());
}
}
//正常出2
return stack2.pop();
}
}
面试结束后,自己复盘时,发现push时判断和循环的操作时多余的,但为什么结果错误呢?断点后发现是pop中for循环条件【i<stack1.size()】导致的,因为该值一直在变。更改后代码如下:
@Test
public void test3() {
Solution solution = new Solution();
solution.push(1);
solution.push(2);
System.out.println("出栈数据:" + solution.pop());
solution.push(3);
System.out.println("出栈数据:" + solution.pop());
System.out.println("出栈数据:" + solution.pop());
solution.push(4);
solution.push(5);
solution.push(6);
System.out.println("出栈数据:" + solution.pop());
System.out.println("出栈数据:" + solution.pop());
System.out.println("出栈数据:" + solution.pop());
}
class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
System.out.println("----- 入栈数据:" + node);
}
public int pop() {
//判断2是否为空,若为空1中数据入2
if(stack2.size() == 0) {
int size = stack1.size();
for(int i = 0;i< size;i++){
Integer pop = stack1.pop();
stack2.push(pop);
}
}
//正常出2
return stack2.pop();
}
}
输出结果:
----- 入栈数据:1
----- 入栈数据:2
出栈数据:1
----- 入栈数据:3
出栈数据:2
出栈数据:3
----- 入栈数据:4
----- 入栈数据:5
----- 入栈数据:6
出栈数据:4
出栈数据:5
出栈数据:6
-------------------------------分------------割----------线----------------------------------------------------------
自己为了加深理解编写,若有误望指正,不喜勿喷~~