当前位置:   article > 正文

C++链队:创建链式队列/初始化、入队、出队、销毁、取队头_c++链队列的销毁

c++链队列的销毁

链队列:队列的链接存储结构称为链队列,通常用单链表表示。其结点的结构与单链表的结点结构相同。根据队列的先进先出特性,为了操作上的方便,设置队头指针指向链队列的头结点,队尾指针指向终端结点。
C++链队列的实现:

1.创建链式队列

  1. typedef int DataType;
  2. struct Node{
  3. DataType data;
  4. Node *next;
  5. };
  6. class LinkQueue{
  7. public:
  8. LinkQueue();//初始化空的链表队列
  9. ~LinkQueue();//释放链队列的存储空间
  10. void EnQueue(DataType x);//入队操作,将元素x出队
  11. DataType DeQueue();//出队操作,将队头元素出队
  12. DataType GetHead();//取链队列队头元素
  13. int Empty();//判断队列是否为空
  14. private:
  15. Node *front,*rear;//队头和队尾指针
  16. int Len;
  17. };
  18. //链队列基本操作的实现本质上是单链表操作的简单化,且时间复杂度均为O(1)

2.构造函数

  1. //构造函数----链队列的初始化
  2. LinkQueue::LinkQueue(){
  3. Node *s=nullptr;
  4. s=new Node;
  5. s->next = nullptr;
  6. front=rear=s;//将队头指针和队尾指针都指向头结点s
  7. }

3.析构函数

  1. //析构函数----链队列的销毁【链队列是动态存储分配,需要释放链队列的所有结点的存储空间】
  2. LinkQueue::~LinkQueue(){
  3. while(front){//释放每一个结点的存储空间
  4. rear=front->next;
  5. delete front;
  6. front=rear;
  7. }
  8. }

 4.入队操作

  1. //入队操作----链队列的插入操作只需考虑在链表的尾部进行
  2. void LinkQueue::EnQueue(DataType x){
  3. Node *s=nullptr;
  4. s=new Node;
  5. s->data=x;s->next=nullptr;
  6. rear->next=s;rear=s;//将结点s插入到队尾
  7. Len++;
  8. }

5.出队操作

  1. //出队操作----链队列的删除操作只需考虑在链表的头部进行
  2. DataType LinkQueue::DeQueue(){
  3. DataType x;
  4. Node *p=nullptr;
  5. if(rear == front) throw "下溢";
  6. p=front->next;x=p->data;
  7. front->next=p->next;
  8. //if(!p->next)
  9. if(rear==p) front=rear;
  10. delete p;
  11. Len--;
  12. return x;
  13. }

6.取队头元素

  1. DataType LinkQueue::GetHead(){
  2. return front->next->data;
  3. }

7.判断队列是否为空

  1. int LinkQueue::Empty(){
  2. if(front==rear) return 1;
  3. else return 0;
  4. }

C++链队列完整代码 :

  1. #include <iostream>
  2. using namespace std;
  3. typedef int DataType;
  4. struct Node{
  5. DataType data;
  6. Node *next;
  7. };
  8. class LinkQueue{
  9. public:
  10. LinkQueue();//初始化空的链表队列
  11. ~LinkQueue();//释放链队列的存储空间
  12. void EnQueue(DataType x);//入队操作,将元素x出队
  13. DataType DeQueue();//出队操作,将队头元素出队
  14. DataType GetHead();//取链队列队头元素
  15. int Empty();//判断队列是否为空
  16. private:
  17. Node *front,*rear;//队头和队尾指针
  18. int Len;
  19. };
  20. //链队列基本操作的实现本质上是单链表操作的简单化,且时间复杂度均为O(1)
  21. //构造函数----链队列的初始化
  22. LinkQueue::LinkQueue(){
  23. Node *s=nullptr;
  24. s=new Node;
  25. s->next = nullptr;
  26. front=rear=s;//将队头指针和队尾指针都指向头结点s
  27. }
  28. //析构函数----链队列的销毁【链队列是动态存储分配,需要释放链队列的所有结点的存储空间】
  29. LinkQueue::~LinkQueue(){
  30. while(front){//释放每一个结点的存储空间
  31. rear=front->next;
  32. delete front;
  33. front=rear;
  34. }
  35. }
  36. //入队操作----链队列的插入操作只需考虑在链表的尾部进行
  37. void LinkQueue::EnQueue(DataType x){
  38. Node *s=nullptr;
  39. s=new Node;
  40. s->data=x;s->next=nullptr;
  41. rear->next=s;rear=s;//将结点s插入到队尾
  42. Len++;
  43. }
  44. //出队操作----链队列的删除操作只需考虑在链表的头部进行
  45. DataType LinkQueue::DeQueue(){
  46. DataType x;
  47. Node *p=nullptr;
  48. if(rear == front) throw "下溢";
  49. p=front->next;x=p->data;
  50. front->next=p->next;
  51. //if(!p->next)
  52. if(rear==p) front=rear;
  53. delete p;
  54. Len--;
  55. return x;
  56. }
  57. //取队头元素
  58. DataType LinkQueue::GetHead(){
  59. return front->next->data;
  60. }
  61. //判断队列是否为空
  62. int LinkQueue::Empty(){
  63. if(front==rear) return 1;
  64. else return 0;
  65. }
  66. int main(){
  67. int x;
  68. LinkQueue Q{};//定义对象变量Q
  69. cout<<"对5和8执行入队操作,";
  70. Q.EnQueue(5);
  71. Q.EnQueue(8);
  72. cout<<"当前队头元素为:"<<Q.GetHead()<<endl;//输出队头元素5
  73. try{
  74. x=Q.DeQueue();
  75. cout<<"执行一次出队操作,出队元素是:"<<x<<endl;//输出出队元素5
  76. } catch(char *str){
  77. cout<<str<<endl;
  78. }
  79. cout<<"当前队头元素为:"<<Q.GetHead()<<endl;//输出队头元素8
  80. try{
  81. cout<<"请输入入队元素:";
  82. cin>>x;
  83. Q.EnQueue(x);
  84. } catch(char *str){
  85. cout<<str<<endl;
  86. }
  87. if(Q.Empty()==1) cout<<"队列为空"<<endl;
  88. else cout<<"队列非空"<<endl;//队列有2个元素,输出队列非空
  89. return 0;
  90. }

 

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

闽ICP备14008679号