两个桟实现一个队列

来源:互联网 发布:消防主机编程 编辑:程序博客网 时间:2024/05/07 05:30

题目:俩个桟实现一个队列,请实现它的俩个函数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>

结果如下:


1 0
原创粉丝点击