博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
纪念逝去的岁月——C++实现一个队列(使用类模板)
阅读量:6973 次
发布时间:2019-06-27

本文共 4963 字,大约阅读时间需要 16 分钟。

1、代码

2、运行结果


 

1、代码

1 #include 
2 #include
3 4 template
class ClsQueueData 5 { 6 private : 7 ClsQueueData * __m_next; 8 T * __m_Data; 9 10 protected : 11 void _clear(); 12 13 public : 14 ClsQueueData(T * pData); 15 ClsQueueData(); 16 ~ClsQueueData(); 17 void destroy(); 18 19 ClsQueueData * getNext(); 20 int setNext(ClsQueueData * p); 21 22 T * getData(); 23 int setData(T * pData); 24 }; 25 26 template
ClsQueueData
::ClsQueueData() 27 { 28 __m_next = NULL; 29 __m_Data = NULL; 30 } 31 32 template
ClsQueueData
::ClsQueueData(T * p) 33 { 34 __m_next = NULL; 35 __m_Data = p; 36 } 37 38 template
ClsQueueData
::~ClsQueueData() 39 { 40 _clear(); 41 } 42 43 template
ClsQueueData
* ClsQueueData
::getNext() 44 { 45 return __m_next; 46 } 47 48 template
int ClsQueueData
::setNext(ClsQueueData * p) 49 { 50 if(NULL == p) 51 { 52 return -1; 53 } 54 p->__m_next = NULL; 55 __m_next = p; 56 57 return 0; 58 } 59 60 template
T * ClsQueueData
::getData() 61 { 62 return __m_Data; 63 } 64 65 template
int ClsQueueData
::setData(T * pData) 66 { 67 __m_Data = pData; 68 return 0; 69 } 70 71 template
void ClsQueueData
::_clear() 72 { 73 if(NULL != __m_Data) 74 { 75 delete __m_Data; 76 } 77 __m_next = NULL; 78 } 79 80 template
void ClsQueueData
::destroy() 81 { 82 __m_Data = NULL; 83 __m_next = NULL; 84 delete this; 85 } 86 87 template
class ClsQueue 88 { 89 private : 90 ClsQueueData
* __m_head; 91 ClsQueueData
* __m_tail; 92 size_t __m_size; 93 94 public : 95 ClsQueue(); 96 ~ClsQueue(); 97 98 int push(T * pData); 99 int pop (T ** pData);100 void clear();101 size_t getSize();102 };103 104 template
ClsQueue
::ClsQueue()105 {106 __m_head = NULL;107 __m_tail = NULL;108 __m_size = 0;109 }110 111 template
ClsQueue
::~ClsQueue()112 {113 __m_size = 0;114 ClsQueueData
* p = __m_head;115 while(p != NULL)116 {117 ClsQueueData
* x = p;118 p = p->getNext();119 delete x;120 }121 __m_head = NULL;122 __m_tail = NULL;123 }124 125 template
int ClsQueue
::push(T * pData)126 {127 ClsQueueData
* pElm = new ClsQueueData
;128 if(NULL == pElm)129 {130 return -1;131 }132 pElm->setData(pData);133 if(NULL == __m_head)134 {135 __m_head = pElm;136 __m_tail = pElm;137 }138 else if(NULL == __m_tail)139 {140 ClsQueueData
* p = __m_head;141 while(p->getNext() != NULL)142 {143 p = p->getNext();144 }145 __m_tail = p;146 }147 else148 {149 __m_tail->setNext(pElm);150 __m_tail = pElm;151 }152 __m_size ++;153 154 return 0;155 }156 157 template
int ClsQueue
::pop (T ** pData)158 {159 if(NULL == __m_head || NULL == pData)160 {161 return -1;162 }163 ClsQueueData
* p = __m_head;164 165 if(__m_head == __m_tail)166 {167 __m_head = __m_tail = NULL;168 }169 else170 {171 __m_head = __m_head->getNext();172 }173 __m_size --;174 *pData = p->getData();175 p->destroy();176 177 return 0;178 }179 180 template
void ClsQueue
::clear()181 {182 ClsQueueData
* p = __m_head;183 while(p != NULL)184 {185 ClsQueueData
* x = p;186 p = p->getNext();187 delete x;188 }189 __m_head = __m_tail = NULL;190 __m_size = 0;191 }192 193 template
size_t ClsQueue
::getSize()194 {195 return __m_size;196 }197 198 int main()199 {200 ClsQueue
objQ;201 int i = 0;202 for(i = 0; i < 10; i++)203 {204 int * x = new int;205 *x = i;206 objQ.push(x);207 printf("line : [%d]; queue size : [%u]\n", __LINE__, objQ.getSize());208 }209 for(i = 0; i < 11; i++)210 {211 int * x = NULL;212 int iRet = objQ.pop(&x);213 printf("line : [%d]; queue size : [%u]\n", __LINE__, objQ.getSize());214 if(-1 == iRet)215 {216 printf("get data faild\n");217 continue;218 }219 if(i == *x)220 {221 printf("RIGHT\n");222 }223 else224 {225 printf("WRONG\n");226 }227 delete x;228 }229 for(i = 0; i < 10; i++)230 {231 int * x = new int;232 *x = i;233 objQ.push(x);234 }235 printf("line : [%d]; queue size : [%u]\n", __LINE__, objQ.getSize());236 objQ.clear();237 printf("line : [%d]; queue size : [%u]\n", __LINE__, objQ.getSize());238 239 return 0;240 }

2、运行结果

  2.1)编译

g++ -g    -c -o queue.o queue.cppg++ -g -o queue queue.o

  2.2)运行结果

$ ./queue line : [207]; queue size : [1]line : [207]; queue size : [2]line : [207]; queue size : [3]line : [207]; queue size : [4]line : [207]; queue size : [5]line : [207]; queue size : [6]line : [207]; queue size : [7]line : [207]; queue size : [8]line : [207]; queue size : [9]line : [207]; queue size : [10]line : [213]; queue size : [9]RIGHTline : [213]; queue size : [8]RIGHTline : [213]; queue size : [7]RIGHTline : [213]; queue size : [6]RIGHTline : [213]; queue size : [5]RIGHTline : [213]; queue size : [4]RIGHTline : [213]; queue size : [3]RIGHTline : [213]; queue size : [2]RIGHTline : [213]; queue size : [1]RIGHTline : [213]; queue size : [0]RIGHTline : [213]; queue size : [0]get data faildline : [235]; queue size : [10]line : [237]; queue size : [0]

 

转载地址:http://hzrsl.baihongyu.com/

你可能感兴趣的文章
diff corp's HBA and multipath
查看>>
页面平滑滚动
查看>>
UIImagePickController打开闪光模式拍照瞬间锁屏crash
查看>>
nodejs项目部署到腾讯云详细步骤
查看>>
PHP 代码调试跟踪工具 Ytrace
查看>>
Go并发调用的超时处理
查看>>
Flutter初探
查看>>
python发送邮件
查看>>
拼?还是熬?一次发散且零散的创业心得分享
查看>>
Android控制颜色透明度百分比的方法
查看>>
开发者人手一个的chrome插件——掘金
查看>>
数据库读写分离,主从同步实现方法
查看>>
好用的Middleware实现
查看>>
如何可视化地查看 Linux 系统磁盘使用情况?
查看>>
Fiddler 抓包工具总结
查看>>
学习hadoop需要什么基础
查看>>
Linux上安装常用软件 & window 管理Linux工具
查看>>
iview-admin运行步骤
查看>>
原生表格组件--GridManager
查看>>
面试阿里,我还是挂在了第四轮……
查看>>