您的位置:首页 > 其它

两个桟实现一个队列

2016-05-06 21:05 267 查看

题目:俩个桟实现一个队列,请实现它的俩个函数appendTail/deleteHead

算法思路:
入队:将元素压入桟s1中;//appendTail
出队:先判断s2中是否为空,如果不为空,直接弹出栈顶元素;否则,将s1中的元素逐个弹出并压入桟s2中,把最后一个元素弹出并出队;//deleteHead

判断队列是否为空(empty()):判断s1/s2中都没有元素时,返回true,否则返回false;//Empty


取队头元素(top()):先判断s2中是否为空,如果不为空,直接取s2栈顶元素;否则,将s1中的元素逐个弹出并压入桟s2中,然后取s2的栈顶元素;//Top

俩个桟都为空,即队列为空时的情况;//特殊情况
最后不做入队、出队的操作时,只要队列不为NULL,就将队列从队头到队尾打印出来,验证结果是否如自己所想;//Print

测试用例:1、数据未全部删除;//Test----->头到尾1->2->3->4->10->99->65
2、数据全部删除;//Test1----->头到尾1->2->3->4->10->99->65
说明:本人使用模板写的,这样可以实例化各种类型;

代码如下:
<span style="font-family:SimSun;font-size:18px;">#include<iostream>
#include<stack>
using namespace std;

template <class T>
class queue
{
public:
queue();
T Top();
bool Empty();
~queue();

void appendTail(const T& _data);
void deleteHead();
void Print();
private:
stack<T> s1;//插入结点的桟
stack<T> s2;//删除结点的桟/取栈顶元素的桟/打印队列元素的桟
};
template <class T>
queue<T>::queue()
{}

template <class T>
queue<T>::~queue()
{
while (!Empty())
{
deleteHead();
}
}

template <class T>
T queue<T>::Top()
{
if (Empty())
{
cout << "Top:queue is NULL!" << endl;
return (T)-1;
}
if (s2.empty())
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}

template <class T>
bool queue<T>::Empty()
{
return (s1.empty() && s2.empty());
}

template <class T>
void queue<T>::appendTail(const T& _data)
{
s1.push(_data);
}

template <class T>
void queue<T>::deleteHead()
{
if (Empty())
{
cout << "deleteHead:queue is NULL!" << endl;
return;
}
if(!s2.empty())
{
s2.pop();
}
else
{
while (!s1.empty())
{
T tmp = s1.top();
s1.pop();
if (!s1.empty())
{
s2.push(tmp);
}
}
}
}

template <class T>
void queue<T>::Print()
{
if (Empty())
{
cout << "Print:queue is NULL!" << endl;
return;
}
while (!Empty())
{
while (!s2.empty())
{
cout << s2.top() << "->";
s2.pop();
}
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
cout << endl;
}

void Test()
{
queue<int> q1;
q1.appendTail(1);
q1.appendTail(2);
q1.appendTail(3);
q1.appendTail(4);
q1.deleteHead();

q1.appendTail(10);
q1.appendTail(99);
q1.appendTail(65);
q1.deleteHead();
q1.Print();
}
void Test1()
{
queue<int> q1;
q1.appendTail(1);
q1.appendTail(2);
q1.appendTail(3);
q1.appendTail(4);
q1.deleteHead();

q1.appendTail(10);
q1.appendTail(99);
q1.appendTail(65);
q1.deleteHead();

q1.deleteHead();
q1.deleteHead();
q1.deleteHead();
q1.deleteHead();
q1.Print();
q1.deleteHead();
q1.Print();
q1.deleteHead();
q1.Top();
}

int main()
{
cout << "Test:" << endl;
Test();
cout << "Test1:" << endl;
Test1();
return 0;
}</span>


结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: