两个队列实现一个栈

来自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;
}


运行结果:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值