当前位置:   article > 正文

数据结构之链式栈(LinkedQueue)源代码

数据结构之链式栈(LinkedQueue)源代码

CLinkedNode.h文件

  1. #pragma once
  2. /*
  3. *Copyright? 中国地质大学(武汉) 信息工程学院
  4. *All right reserved.
  5. *
  6. *文件名称:CPolynomial.h
  7. *摘 要:利用链表结构完成多项式的表示及其运算
  8. *
  9. *当前版本:1.0
  10. *作 者:邵玉胜
  11. *完成日期:2018-04-16
  12. */
  13. #ifndef CLINKEDQUEUE
  14. #define CLINKEDQUEUE
  15. #include<iostream>
  16. using namespace std;
  17. template<class _Ty>
  18. struct CLinkedNode{
  19. _Ty m_tData;
  20. CLinkedNode<_Ty>* m_pLink;
  21. CLinkedNode(_Ty data, CLinkedNode<_Ty>* next = nullptr) {
  22. m_tData = data;
  23. m_pLink = next;
  24. }
  25. CLinkedNode<_Ty>* InsertAfter(const _Ty data) {
  26. m_pLink = new CLinkedNode<_Ty>(data);
  27. if (m_pLink == nullptr) {
  28. cerr << "内存分配错误!" << endl;
  29. exit(-1);
  30. }
  31. return m_pLink;
  32. }
  33. };
  34. template<class _Ty>
  35. class CLinkedQueue {
  36. public:
  37. CLinkedQueue():m_pFront(nullptr), m_pRear(nullptr) {} //构造函数,将头指针与尾指针都设为空
  38. CLinkedQueue(CLinkedQueue<_Ty>& Q); //赋值构造函数
  39. ~CLinkedQueue(); //析构函数
  40. CLinkedQueue<_Ty>& operator = (CLinkedQueue<_Ty>& Q); //重载赋值运算符
  41. void EnQueue(const _Ty data); //进队
  42. bool DeQueue(_Ty& data); //出队
  43. bool GetFront(_Ty& data); //获取队头值
  44. void MakeEmpty(); //置空函数
  45. bool IsEmpty(); //判空函数
  46. int GetSize(); //获取队列大小
  47. //重载输入运算符
  48. //模板类的输入输出运算符的重载要写在类内种
  49. friend istream& operator >> (istream& in, CLinkedQueue<_Ty>& Q) {
  50. cout << "请输入一个队列,输入\"#\"结束:";
  51. _Ty data;
  52. while (in >> data) {
  53. if (data == '#')
  54. break;
  55. else {
  56. Q.EnQueue(data);
  57. }
  58. }
  59. return in;
  60. }
  61. friend ostream& operator<<(ostream& out, CLinkedQueue<_Ty>& Q) {
  62. CLinkedNode<_Ty>* srcPtr = Q.GetHead();
  63. if (srcPtr == nullptr)
  64. out << "队列为空!" << endl;
  65. else {
  66. _Ty data;
  67. out << "队列中的元素为:";
  68. while (srcPtr != nullptr) {
  69. data = srcPtr->m_tData;
  70. out << data << " ";
  71. srcPtr = srcPtr->m_pLink;
  72. }
  73. out << endl;
  74. }
  75. return out;
  76. }
  77. private:
  78. CLinkedNode<_Ty>* GetHead() { return m_pFront; } //获取头指针
  79. CLinkedNode<_Ty>* m_pFront; //头指针
  80. CLinkedNode<_Ty>* m_pRear; //尾指针
  81. };
  82. //赋值构造函数
  83. template<class _Ty>
  84. CLinkedQueue<_Ty>::CLinkedQueue(CLinkedQueue<_Ty>& Q) {
  85. CLinkedNode<_Ty>* srcPtr = Q.GetHead(); //指向参数第一个结点
  86. _Ty data;
  87. while (srcPtr != nullptr) { //如果还未复制完
  88. data = srcPtr->m_tData; //取出当前结点的数值
  89. this->EnQueue(data); //将该数值到本对象
  90. srcPtr = srcPtr->m_pLink; //指向参数队列指向下一项
  91. }
  92. }
  93. //析构函数
  94. template<class _Ty>
  95. CLinkedQueue<_Ty>::~CLinkedQueue() {
  96. this->MakeEmpty(); //直接调用置空函数
  97. }
  98. //重载赋值运算符
  99. template<class _Ty>
  100. CLinkedQueue<_Ty>& CLinkedQueue<_Ty>::operator = (CLinkedQueue<_Ty>& Q) {
  101. CLinkedNode<_Ty>* srcPtr = Q.GetHead(); //指向参数第一个结点
  102. _Ty data;
  103. while (srcPtr != nullptr) { //如果还未复制完
  104. data = srcPtr->m_tData; //取出当前结点的数值
  105. this->EnQueue(data); //将该数值到本对象
  106. srcPtr = srcPtr->m_pLink; //指向参数队列指向下一项
  107. }
  108. return *this;
  109. }
  110. //进队
  111. template<class _Ty>
  112. void CLinkedQueue<_Ty>::EnQueue(const _Ty data) {
  113. if (m_pFront == nullptr) { //如果队列为空
  114. m_pFront = m_pRear = new CLinkedNode<_Ty>(data);
  115. if (m_pFront == nullptr) { //内存分配错误
  116. cerr << "内存分配错误!" << endl;
  117. exit(-1);
  118. }
  119. }
  120. else{ //队列不为空
  121. m_pRear = m_pRear->InsertAfter(data);
  122. if (m_pRear == nullptr) {
  123. cerr << "内存分配错误!" << endl;
  124. exit(-1);
  125. }
  126. }
  127. }
  128. //出队
  129. template<class _Ty>
  130. bool CLinkedQueue<_Ty>::DeQueue(_Ty& data) {
  131. if (m_pFront == nullptr) //如果队列为空,直接返回假
  132. return false;
  133. CLinkedNode<_Ty>* pfront = m_pFront; //定义一个临时变量指向头结点,用于释放空间
  134. data = pfront->m_tData; //将头结点的值赋值给参数
  135. m_pFront = m_pFront->m_pLink; //指向头结点的下一结点
  136. delete pfront; //释放原头结点的空间
  137. return true;
  138. }
  139. //获取队头值
  140. template<class _Ty>
  141. bool CLinkedQueue<_Ty>::GetFront(_Ty& data) {
  142. if (m_pFront == nullptr) //如果队列为空,返回假
  143. return false;
  144. data = m_pFront->m_tData; //用队头的值给data赋值
  145. return true;
  146. }
  147. //置空函数
  148. template<class _Ty>
  149. void CLinkedQueue<_Ty>::MakeEmpty() {
  150. CLinkedNode<_Ty>* pdel = nullptr; //指向删除结点
  151. while (m_pFront != nullptr) { //循环删除结点
  152. pdel = m_pFront;
  153. m_pFront = m_pFront->m_pLink;
  154. delete pdel;
  155. }
  156. m_pRear = nullptr; //为安全起见,将m_pRear指向空
  157. }
  158. //判空函数
  159. template<class _Ty>
  160. bool CLinkedQueue<_Ty>::IsEmpty() {
  161. return m_pFront == nullptr;
  162. }
  163. //获取队列大小
  164. template<class _Ty>
  165. int CLinkedQueue<_Ty>::GetSize() {
  166. CLinkedNode<_Ty>* pelement = m_pFront; //临时指针,指向队列元素
  167. int count = 0; //用于计数的临时变量,初始化为0
  168. while (pelement != nullptr) { //当所指向的元素不为空时,说明没有到队尾指针
  169. ++count; //计数加一
  170. pelement = pelement->m_pLink; //指向下一元素
  171. }
  172. return count;
  173. }
  174. #endif

main.cpp文件(测试文件)

  1. #include"CLinkedQueue.h"
  2. int main() {
  3. CLinkedQueue<int>* testQueue = new CLinkedQueue<int>();
  4. cin >> *testQueue;
  5. cout << *testQueue;
  6. int front;
  7. if (testQueue->DeQueue(front) == true) {
  8. cout << front << "出队" << endl;
  9. cout << "当前共有" << testQueue->GetSize() << "个元素" << endl;
  10. cout << *testQueue;
  11. }
  12. if (testQueue->GetFront(front) == true)
  13. cout << "当前的队头元素为:" << front << endl;
  14. CLinkedQueue<int>* copyQueue = new CLinkedQueue<int>(*testQueue);
  15. cout << "* copyQueue:" << endl;
  16. cout << *copyQueue;
  17. delete testQueue;
  18. return 0;
  19. }

测试结果


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/701108
推荐阅读
相关标签
  

闽ICP备14008679号