牛客网第七题:
编程链接:
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
用一个栈专门来完成push操作;
用另一个栈来完成pop操作,如果这个栈为空,那么就把第一个栈的元素依次出栈然后入栈到该栈,由于元素在第一个栈中是先入后出,经过转移的步骤,元素就变成了先入先出了,满足队列的性质。
解题:
首先得清楚栈和队列的基本概念,栈是先进后出,队列是先进先出。
栈就是前面是封死的,进去了还得退出来。
而队列就是排队,排的越早,出去的也越早。
所以要用栈实现队列,考虑的就是一个栈用来专门push数据,另一个专门pop数据。
看代码:
class Solution
{
public:
void push(int node) {
stack1.push(node); //将stack1作为输入栈
}
int pop() {
if(stack2.empty())//如果输出栈是空的,则需要把输入栈的数据放进输出栈。
{
while(!stack1.empty()) //把输入栈的所有数据全部放入输出栈,则刚好反向
{
stack2.push(stack1.top());
stack1.pop();
}
}
int ret = stack2.top(); //之后输出输出栈的第一个即可
stack2.pop();
return ret;
}
private:
stack<int> stack1;
stack<int> stack2;
};
那么,如何用两个队列实现一个栈呢?
两个队列中始终保持一个队列永远为空;
push操作:把元素入不为空的那个队列;
pop操作:由于一个队列为空,于是把不为空的那个队列的元素出队到为空的这个队列,直到不为空的队列只剩一个元素为止,这个时候把这个元素弹出队列返回,这样就又保证了两个队列中保持一个队列永远为空。
要用队列实现,栈,就需要来回倒腾。
从一个队列,放到另一个空队列里,再输出即可。
代码如下:
class Solution
{
public:
void push(int node) {
que1.empty() ? que2.push(node) : que1.push(node); //谁空,不放谁
}
int pop() {
auto &que_out = que1.empty() ? que2 : que1; //空的是输出队列,另一个是输入队列。
auto &que_in = que1.empty() ? que1 : que2;
while (que_out.size() > 1) //输出的只剩一个
que_in.push(que_out.front()), que_out.pop();
int ret = que_out.front(); //把最后一个返回即可
que_out.pop();
return ret;
}
private:
queue<int> que1;
queue<int> que2;
};