# 面试题9:用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
算法思想:一个队列用两个栈进行操作,队列是先进先出,栈是后进先出、先进后出型数据机构。
1,push操作: 元素进入stack1以前,需要把stack2中的元素依次push回stack1,才运行stack1 push新元素进来. pop操作: 先从栈1依次弹出到stack2,然后弹出栈2顶部的元素。整个过程就是一个队列的先进先出
2,但是在交换元素的时候需要判断两个栈的元素情况:
“进队列时”,队列中是不是还有元素,若有,说明栈2中的元素不为空,此时就先将栈2的元素倒回到栈1 中,保持在“进队列状态”。
“出队列时”,将栈1的元素全部弹到栈2中,保持在“出队列状态”。
所以要做的判断是,进时,栈2是否为空,不为空,则栈2元素倒回到栈1,出时,将栈1元素全部弹到栈2中,直到栈1为空。
class Solution
{
public:
void push(int node) {
while (!stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
stack1.push(node);
}
int pop() {
if (stack2.empty()){
while (! stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
if (stack2.empty())
return -1;
int head = stack2.top();
stack2.pop();
return head;
}
private:
stack<int> stack1;
stack<int> stack2;
};
面试题10: 斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
算法思路:典型的递归算法,但是递归算法本质是在调用栈,因存在大量重复计算容易导致内存溢出 。换一种思想,为了防止大量重复计算,那就把之前的结果保存下来。
算法1:使用迭代法,用fibMin1和fibMin2保存计算过程中的结果,并复用起来。
class Solution {
public:
int Fibonacci(int n) {
if (n == 0) return 0;
else if (n == 1) return 1;
int fibMin2 = 1, fibMin1 = 0, fibN = 0;
for (unsigned int i = 2; i <= n; ++i){
fibN = fibMin1 + fibMin2;
fibMin1 = fibMin2;
fibMin2 = fibN;
}
return fibN;
}
};
算法2:
class Solution {
public:
int Fibonacci(int n) {
if (n == 0) return 0;
else if (n == 1) return 1;
int fibMin2 = 1, fibMin1 = 0;
while(--n){
fibMin2 += fibMin1;
fibMin1 = fibMin2 - fibMin1;
}
return fibMin2;
}
};
还有其他算法思路,比如动态规划、矩阵幂。笔者知识有限,暂不论述。