两个桟实现一个队列
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>
结果如下:
相关文章推荐
- Qt 学习笔记2 摘自《Qt 学习之路 2》
- 怎么让adb shell直接进入root?
- LaTeX排版Book模板
- RedHat设置SSH免密码登录
- 渣渣写LEETCODE——258. Add Digits
- C++基础知识——二维数组做函数参数
- INotifyPropertyChanged接口
- 道德经--老子
- Dubbo源码分析(四):dubbo中bean的加载
- uva10635(LCS转换为求LIS)
- [svc][op]SSH公钥认证+优化
- Java 8从永久代到metaspace
- Common used English
- HDU 专题分类
- shell---消除文件后缀四种方法
- Object Detection with DPM
- nyoj55懒省事的小明(STL优先队列)
- 本文建模系列值三:LDA感悟
- poj 1321棋盘问题(补充)
- IOS自动释放原理及详解