Chapter 3 | Stacks and Queues--两个栈实现队列

3.5  Implement a MyQueue class which implements a queue using two stacks.

译文:

利用两个栈实现一个队列 MyQueue。


都知道队列的特点是 “先进先出”(FIFO),栈的特点是 “先进后出”(FILO)。可以很简单的通过两个栈来实现一个队列,即实现队列,则先将数据压入第一个栈,然后依次弹出并压进第二个栈,随后出栈,就满足 FIFO,关键是数据入队和出队该怎么处理,必须保证单次数据处理都满足FIFO,两个栈,可以第一个栈负责入队,第二个栈负责出栈,当有新数据入队时,将其压入第一个栈,出队时,则将第二个栈的数据弹出,当第二个栈为空时,出队则将第一个栈依次弹出并压入第二个栈,然后出栈。

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

template <class Elem>
class MyQueue
{
public:
	MyQueue() {}
	~MyQueue() {}

	void EnQueue(const Elem &Item);
	Elem DeQueue(void);
	void Move(stack<Elem> &first, stack<Elem> &last);
	bool isEmpty(void);
	unsigned int Size(void);

private:
	stack<Elem> stack_in;
	stack<Elem> stack_out;
};

//将数据依次从第一个栈弹出,然后压入第二个栈
template <class Elem>
void MyQueue<Elem>::Move(stack<Elem> &stack_first, stack<Elem> &stack_last)
{
	while (!stack_first.empty())
	{
		stack_last.push(stack_first.top());
		stack_first.pop();
	}
}

//入队直接压进第一个栈
template <class Elem>
void MyQueue<Elem>::EnQueue(const Elem &Item)
{
	stack_in.push(Item);
}

//出队是从第二个栈弹出,先判断第二个栈是否为空,为空则须将第一个栈的数据弹出并压入第二个栈,然后出栈
//不为空则直接从第二个栈出栈
template <class Elem>
Elem MyQueue<Elem>::DeQueue(void)
{
	if (stack_out.empty())
		Move(stack_in, stack_out);
	
	Elem Item = stack_out.top();
	stack_out.pop();
	return Item;
}

template <class Elem>
bool MyQueue<Elem>::isEmpty(void)
{
	return (stack_in.empty() && stack_out.empty());
}

template <class Elem>
unsigned int MyQueue<Elem>::Size(void)
{
	return (stack_in.size() + stack_out.size());
}



你可能感兴趣的:(栈,队列,coding,the,Cracking)