剑指Offer之 - 用两个栈实现队列

本文介绍如何使用两个栈实现一个队列的功能,以及如何利用两个队列实现一个栈的操作。通过具体的代码实现展示了数据结构转换的原理。

题目:

用两个栈实现一个队列。

思路:

[1]      入队列就直接把数据放到第一个栈里

[2]      出队列就判断第二个栈是否为空,不为空的话,第二个栈直接出栈结果就是出队列,若为空就把第一个栈里的数据转移到第二个栈里,然后第二个栈再出栈

代码:

#include <iostream>
#include <stack>
using namespace std;

//功能:用两个栈实现一个队列的添加元素和删除元素功能
//添加:直接在栈1内添加
//删除:判断栈2是否为空,如果不为空,则直接从栈2中删除,如果为空,则把栈1的元素搬到栈2中,然后删除栈2的栈顶即可
template <typename T> 
class CQueue
{
public :
	CQueue(){};
	~CQueue(){};

	void appendTail(const T& node);
	T deleteHead();
private:
	stack<T> stack1;
	stack<T> stack2;
};

template<typename T> void CQueue<T>::appendTail(const T& element)
{
	stack1.push(element);
}
template<typename T> T CQueue<T>::deleteHead()
{
	//如果stack2为空,则把stack1的内容全部挪过来,否则,直接删除stack2的栈顶
	if(stack2.size() <= 0)
	{
		while(stack1.size() > 0)
		{
			T &data = stack1.top();
			stack1.pop();
			stack2.push(data);
		}
	}
	if(stack2.size() == 0)
		throw new exception("queue is empty");
	T head = stack2.top();
	stack2.pop();
	return head;
}

int main()
{
	CQueue<int> q;
	q.appendTail(1);
	q.appendTail(2);
	q.appendTail(3);
	q.appendTail(4);
	q.appendTail(5);
	q.deleteHead();
}

相关题目:

用两个队列实现一个栈。

思路:

[1]      始终有一个队列为空。入栈就把数据放到非空的队列。

[2]      出栈就把非空的队列的除了最后一个数据,其他数据都转移到另一个队列,然后让最后一个数据出队列就是出栈。

代码:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;

//功能:用两个队列实现一个栈
//[1]	始终有一个队列为空。入栈就把数据放到非空的数列
//[2]	出栈就把非空的队列的除了最后一个数据,其他数据都转移到另一个队列,然后让最后一个数据出队列就是出栈。

template <typename T> 
class CStack
{
public :
	CStack(){};
	~CStack(){};

	void pushback(const T& node);
	T popback();
private:
	queue<T> queue1;
	queue<T> queue2;
};

//入栈
template<typename T> void CStack<T>::pushback(const T&node)
{
	if(queue1.empty() && queue2.empty())
		queue1.push(node);
	else
		if(!queue1.empty())
			queue1.push(node);
		else
			queue2.push(node);
}
//出栈
template<typename T> T CStack<T>::popback()
{
	if(queue1.empty() && queue2.empty())
		throw new exception("stack is empty");
	if(!queue1.empty())
	{
		while(queue1.size() != 1)
		{
			T tmp = queue1.front();
			queue1.pop();
			queue2.push(tmp);
		}
		T result = queue1.front();
		queue1.pop();
		return result;
	}
	else
		if(!queue2.empty())
		{
			while(queue2.size() != 1)
			{
				T tmp = queue2.front();
				queue2.pop();
				queue1.push(tmp);
			}
			T result = queue2.front();
			queue2.pop();
			return result;
		}
}

int main()
{
	CStack<int> data;
	data.pushback(1);
	data.pushback(2);
	data.pushback(3);
	data.popback();
	data.popback();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值