来自CLRS习题。
思路:第一次有元素入栈时,两个队列都为空,假设该元素进入队列q1。当需要元素出栈时,将不为空的队列中除去最后一个元素“搬”到另一个为空的队列,然后将第一个队列中剩余的一个元素出队就完成出队操作。此后若入栈,则选择一个不为空的队列入队;若出栈,则重复上面的操作。用队列实现栈时比用栈实现队列要略微麻烦一些,因为虽然每次入栈是O(1)的操作,而每次出栈都需要将n-1个元素搬至另外一个空队列中。
代码:
// queuetostack.cpp : 定义控制台应用程序的入口点。
// 两个队列实现一个栈
#include "stdafx.h"
#include <iostream>
#include <queue>
using std::cin;
using std::cout;
using std::endl;
using std::cerr;
using std::queue;
queue<int> q1, q2;
void push(int elem)
{
if (q1.empty() && q2.empty()) //首次插入到q1
q1.push(elem);
//之后优先插入到非空队列
else if (!q1.empty())
q1.push(elem);
else if (!q2.empty())
q2.push(elem);
else
cerr << "an error happened!" << endl;
}
int pop()
{
//空的队列用于容纳非空队列的前n-1个元素
//剩下的一个元素为当前要出栈的元素
//依次循环
if (!q1.empty())
{
int size = q1.size();
if (size == 1)
{
int temp = q1.front();
q1.pop();
return temp;
}
else
{
size--;
while (size--)
{
q2.push(q1.front());
q1.pop();
}
int temp = q1.front();
q1.pop();
return temp;
}
}
else if (!q2.empty())
{
int size = q2.size();
if (size == 1)
{
int temp = q2.front();
q2.pop();
return temp;
}
else
{
size--;
while (size--)
{
q1.push(q2.front());
q2.pop();
}
int temp = q2.front();
q2.pop();
return temp;
}
}
else
{
cerr << "stack underflow!" << endl;
return -1;
}
}
int main()
{
int in, out;
int cmd;
while (cin >> cmd)
{
switch (cmd)
{
case 1: //入栈
cin >> in;
push(in);
break;
case 2: //出栈
cout << pop() << endl;
break;
default:
cerr << "error command!" << endl;
break;
}
}
system("pause");
return 0;
}
运行结果: