剑指offerWeek1
周六:用两个栈实现队列
题目链接:用两个栈实现队列
请用栈实现一个队列,支持如下四种操作:
push(x) – 将元素x插到队尾;
pop() – 将队首的元素弹出,并返回该元素;
peek() – 返回队首元素;
empty() – 返回队列是否为空;
注意:
你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty;
如果你选择的编程语言没有栈的标准库,你可以使用list或者deque等模拟栈的操作;
输入数据保证合法,例如,在队列为空时,不会进行pop或者peek等操作;
数据范围
每组数据操作命令数量 [0,100]
。
样例
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // returns 1
queue.pop(); // returns 1
queue.empty(); // returns false
AC代码
class MyQueue {
public:
stack<int> a, b;
/** Initialize your data structure here. */
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
a.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
while (a.size() > 1) b.push(a.top()), a.pop();
int x = a.top();
a.pop();
while (b.size()) a.push(b.top()), b.pop();
return x;
}
/** Get the front element. */
int peek() {
while (a.size() > 1) b.push(a.top()), a.pop();
int x = a.top();
while (b.size()) a.push(b.top()), b.pop();
return x;
}
/** Returns whether the queue is empty. */
bool empty() {
return a.empty();
}
};
思路:
整体思路
牢记栈和队列的特性
栈:先进后出,类似子弹装载
队列:先进先出
因此,用两个栈模拟队列的行为
- 入队:正常入栈
- 出队:由于在栈中,先进的元素会最后一个出,而队列需要先出,因此,队列弹出元素时,弹出队首元素,那么只需要把A栈中所有元素原封不动装入到B中,然后从B中弹出栈顶,然后其余元素再弹回A栈,即可
- 查看队首元素:参考出队操作
- 判断是否为空:查看栈是否为空
部分模拟
样例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // returns 1
queue.pop(); // returns 1
queue.empty(); // returns false
操作 | A栈 | 描述 |
---|---|---|
queue.push(1); | 1 | 将1放入A栈中 |
queue.push(2); | 1, 2 | 将2放入A栈中 |
queue.peek(); // returns 1 | 1, 2 | 将A栈所有元素放入B栈,然后B栈栈顶返回,再把B栈元素装回A栈 |
queue.pop(); // returns 1 | 2 | 将A栈所有元素放入B栈,然后B栈栈顶探出,再把B栈元素装回A栈 |
queue.empty(); // returns false | 2 | 判断A栈是否为空 |
剑指offerWeek1
周六:斐波那契数列
题目链接:斐波那契数列
输入一个整数 n
,求斐波那契数列的第 n
项。
假定从 0
开始,第 0
项为 0
。
数据范围
0≤n≤39
样例
输入整数 n=5
返回 5
AC代码
class Solution {
public:
int Fibonacci(int n) {
int a = 0, b = 1;
while (n -- )
{
int c = a + b;
a = b, b = c;
}
return a;
}
};
思路:
公式:第三个元素等于前两个元素之和(从第三个元素开始),特别的,第一个元素为0,第二个元素为1