两个队列模拟一个栈行为;

两个队列q1,q2,队列构造函数默认构造两个空队列。

将元素入队到q1中,经过一系列入队操作,q1非空,含有n个元素,q2为空队;

将q1中元素依次出队并入队q2,直至只剩下一个元素, 即q1出队n-1个元素,并依次入队到q2中。

此时,q1中仅剩的唯一一个元素,是期初队列最后入队的元素,将该元素删除(pop),就模拟完成了栈的栈顶元素出栈;在删除之前取出该元素,就模拟完成了取栈顶元素 ,这和栈的后进先出一致

此时,q1,为空,q2非空,接下来要做的就是循环的对非空队列入队,取最后一个元素

 

//两个队列模拟栈

class SimulateStack
{
public:
	SimulateStack(){ count = 0;}
	~SimulateStack(){ }
	void simPush(int); //模拟入栈
	void simPop(); //模拟出栈
	int simTop();//取栈顶元素
	int simSize();//计算栈元素个数;
	bool simEmpty();
private:
	queue<int> q1;
	queue<int> q2;
	int count;
};
//入栈
inline
	void SimulateStack::simPush(int num)
{
	if (!q1.empty())
	{
		q1.push(num);
	}
	else
		q2.push(num);
	count++;
}
//出栈
inline
	void SimulateStack::simPop()
{
	//int tmp;
	if (!q1.empty())
	{
		while (q1.size()!=1)
		{
			q2.push(q1.front());
			q1.pop();
		}
		//tmp = q1.front();
		q1.pop();
	}
	else
		if (!q2.empty())
		{
			while (q2.size()!=1)
			{
				q1.push(q2.front());
				q2.pop();
			}
			//tmp = q2.front();
			q2.pop();
		}
		--count;
}
//取栈顶元素
inline
	int SimulateStack::simTop()
{
	int tmp;
	if (!q1.empty())
	{
		tmp = q1.back();
	}
	else
	{
		if (!q2.empty())
		{
			tmp = q2.back();	
		}
	}	
	return tmp;
}
inline
	int SimulateStack::simSize()
{
	return count;
}
inline
	bool SimulateStack::simEmpty()
{
	return (count == 0);
}

int main()
{
	SimulateStack st;
	st.simPush(1);
	st.simPush(2);
	st.simPush(3);
	st.simPush(4);
	st.simPush(5);
int st_size = st.simSize();
cout << "stack size: "<<st_size<<endl;
//栈顶元素为5,
cout << "top element: " << st.simTop();
//5出栈
st.simPop();
cout <<endl;
//此时栈顶元素为4,取栈顶元素
cout <<"current top element:" << st.simTop() <<endl;

 

}

结果输出,取栈顶元素5,然后5出栈,此时栈顶元素为4,符合后进先出原则;

 

 

posted @ 2018-05-19 10:52  FocusA  阅读(1104)  评论(0)    收藏  举报