1.考点:
- 考点1:栈和队列的运行机制理解,以及两者之间的相互关系理解;
- 考点2:模板的理解(模板写的比较多了所以这里没用模板写)
2.思想
- 队是先进先出,栈是先进后出,两者相互实现时,把思路理清就OK。
- (1)两个栈实现队列:两个栈当两个杯子A和B,加水(push)都往A里面push;而删除(pop)都从B的顶端进行删除,当B中没有水时,向A申请加水,A会把所有的水全部倒进来,然后B倒出最上面的那点水(这点水就是A中最底层最先进来的数据);
- (2)两个队列实现栈:保证只有一个队列有数据,即两个队列AB之间来回倒,push数据时向有数据的那个队列push(两队列都没有数据时默认为A);pop数据时,将有数据的队列倒入另一个没数据的队列,途中克扣掉最后的数据(也就是栈中刚刚加进去的数据)进行删除,实现pop。
3.代码
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
class Solution
{
public:
void push(int node)
{
stack1.push(node);
}
int pop()
{
if (stack2.size() <= 0)
{
while (stack1.size() > 0)
{
stack2.push(stack1.top());
stack1.pop();
}
if (stack2.size() <= 0)
throw new exception("queue is empty!");
}
int head = stack2.top();
stack2.pop();
return head;
}
private:
stack<int> stack1;
stack<int> stack2;
};
class Solution2
{
public:
void push(int node)
{
if (queue2.size() > 0)
queue2.push(node);
else
queue1.push(node);
}
int pop()
{
if (queue2.size() > 0)
{
while (queue2.size() > 1)
{
queue1.push(queue2.front());
queue2.pop();
}
int head = queue2.front();
queue2.pop();
return head;
}
else if (queue1.size() > 0)
{
while (queue1.size() > 1)
{
queue2.push(queue1.front());
queue1.pop();
}
int head = queue1.front();
queue1.pop();
return head;
}
else
throw new exception("queue is empty!");
}
private:
queue<int> queue1;
queue<int> queue2;
};
int main()
{
Solution2 Cstack;
Cstack.push(1);
Cstack.push(2);
Cstack.push(3);
Cstack.push(4);
Cstack.push(5);
cout << Cstack.pop() << endl;
cout << Cstack.pop() << endl;
cout << Cstack.pop() << endl;
cout << Cstack.pop() << endl;
cout << Cstack.pop() << endl;
return 0;
}