您的位置:首页 > 产品设计 > UI/UE

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

2014-03-21 16:36 337 查看
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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息