今天进度来到了栈与队列
232.用栈实现队列
思路
栈是先进后出,队列是先进先出,那么如何用栈来实现队列呢?
可以使用两个栈,一个输入栈,一个输出栈。
当要push时,就push进输入栈,当要pop时,先判断输出栈是否为空,如果为空的话,就将输入栈里面的元素全部push进输出栈,然后pop一下就可以啦。
至于peek操作,跟pop操作无非是一个是弹出,一个不弹出罢了。
判断队列是否为空的话,如果输入栈和输出栈全部为空,那就算是空了。
代码实现
class MyQueue {
stack<int>inQ;
stack<int>outQ;
public:
MyQueue() {
}
void push(int x) {
inQ.push(x);
}
int pop() {
if(outQ.empty())
while(!inQ.empty())
{
outQ.push(inQ.top());
inQ.pop();
}
int res = outQ.top();
outQ.pop();
return res;
}
int peek() {
int res = this->pop();
outQ.push(res);
return res;
}
bool empty() {
return inQ.empty()&&outQ.empty();
}
};
总结
在pop操作时,我在想为什么还要判断输出栈为空,一股脑直接把输入栈的push进输出栈不可以吗?思考之后发现是不可以的,因为此时输出栈的栈顶元素是队列的第一个元素,如果不判断输出栈是否为空就直接push进来的话,栈顶元素就会被更新,替换为其他元素,那么队列的第一个元素也就发生了改变,那么pop的话就会出错。
225.用队列实现栈
思路
用队列实现栈,一开始毫无头绪,其实想通之后还是蛮有趣以及好理解的。
push操作的话,就是直接push就可以了。
pop操作就需要好好想一下了,大家想一下,队列是先进先出,栈是先进后出,那么如果我要弹出栈顶元素,那也就是让队列的最后一个元素出队,但是队列只能让队头元素出队呀。
但是!我们可以一直让队头元素出队,然后将这个元素入队,作为队尾,这样的话原来的队尾就鞭变成了队头,可以直接出队了。
top操作的话用一下.back()返回就可以啦。
empty操作的话,队列空了,那这个栈就空了,直接用.empty()判断一下就可以了。
代码实现
class MyStack {
queue<int>stk;
public:
MyStack() {
}
void push(int x) {
stk.push(x);
}
int pop() {
int _size = stk.size()-1;
while(_size--)
{
stk.push(stk.front());
stk.pop();
}
int res = stk.front();
stk.pop();
return res;
}
int top() {
return stk.back();
}
bool empty() {
return stk.empty();
}
};
总结
今天的两道题虽然平常使用不到的,但是还是蛮磨炼思维的。