利用两个栈实现队列

方法一:

在金安等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站制作 网站设计制作按需定制网站,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,成都外贸网站制作,金安网站建设费用合理。

入队时,将元素压入s1。

出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。

方法二:

入队时,先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。

出队时,先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。

最优解:

入队时,将元素压入s1。

出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。

注意:考虑没有元素可供出队时的处理(2个栈都为空的时候,出队操作一定会引起异常)

代码实现

//test1.h
#include
#include
using namespace std;
template
class queueWithTwoStack
{
public:
	queueWithTwoStack();
	~queueWithTwoStack();
	void addTail(const T& data);
	T deleteHead();
private:
	stack s1;
	stack s2;
};

//test1.cpp
#include "test1.h"
using namespace std;
template
queueWithTwoStack::queueWithTwoStack()
{}
template
queueWithTwoStack::~queueWithTwoStack()
{}
//加只加在S1中
template
void queueWithTwoStack::addTail(const T& data)
{
	s1.push(data);
}
//删只删S2中的
template
T queueWithTwoStack::deleteHead()
{
	if((s2.empty())&&(s1.empty()))
	{
		printf("is empty!\n");
		return -1;
	}
	//s2为空,把S1全倒在S2中后删
	if(s2.empty())
	{
		while(!s1.empty())
		{
			T top=s1.top();
			s1.pop();
			s2.push(top);
		}
	}
	//s2不为空直接删
	T head=s2.top();
	s2.pop();
	return head;	
}
void test1()
{
	queueWithTwoStack qw;
	qw.addTail(1);
	qw.addTail(2);
	qw.addTail(3);
	cout< qw;
	qw.addTail(1);
	qw.addTail(2);
	qw.addTail(3);
	cout<

参考:《剑指offer》面试题7

    http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html



网站标题:利用两个栈实现队列
网页URL:http://hbruida.cn/article/ihciii.html