当前位置:   article > 正文

数据结构与算法——队列_数据结构和算法 队列

数据结构和算法 队列

一、队列的定义

这里我用一个生活中的小例子引出队列的定义和一些特点

队列在现实生活中有很多的例子,就比如食堂排队的时候,就是一个典型的队列,而作为排队的人就是队列中的元素,先到食堂窗口的率先买上饭就可以离开了,但是也有一些意外的情况,就比如有一些同学喜欢乱插队,导致后面的同学要多等一个人,也有时呢,前面的某个同学不想吃这家窗口的饭了,然后离开了,在他之后的学生呢,也都会向前一步,还有当饭卖完了,这个窗口排队的人就唉声叹气解散了。

根据例子不难可以发现,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的种类

      1.顺序表建立的队列

      2.链表建立的队列

      3.循环队列

二、队列的特点:

        1.仅在表尾进行插入操作,表头进行删除操作的线性表

        2.先进先出(FIFO -- First int first out)!

        3.插入--> 入队  删除-->出队

三、队列的基本操作

同样跟前面线性表一样,队列呢也有顺序结构和链式结构,在项目或者实例中呢往往用的循环顺序队列比较多。

        1.队列结构定义

        

  1. #define MAXSIZE 100
  2. struct Queue
  3. {
  4. QElemtype *base; //QElemtype 为自定义的数据类型
  5. int front; //用int类型指向队列的头位置
  6. int rear; //指向队列的尾位置
  7. };

注意: 关于队列的溢出问题

1.解决假上溢的方法:

将空间想成一个循环的表,即分配给队列的存储单元可以循环使用,当rear = maxsize,若向量的开端空着,又可以从头使用,当front为maxsize时也同样使用。

引入循环队列

base[0]按在base[maxsize - 1] 之后,若rear+1==M,则令rear=0。利用模(mod,c语言中:%)运算。

添加元素:

Q.base[Q.rear] = x;

Q.rear[Q.rear + 1] % MAXSIZE

删除元素:

x = Q.base[Q.front]

Q.front = (Q.front + 1)%MAXSIZE

        2.初始化

  1. //顺序表
  2. void Init()
  3. {
  4. base = new QElemtype[MAXSIZE];
  5. rear = front = 0;
  6. }
  7. //链式
  8. void Init()
  9. {
  10. front = rear = new Qnode[MAXSIZE];
  11. if(!front)
  12. cout <<"初始化失败";exit(0);
  13. front->next = nullptr;
  14. }

 

 

         3.销毁队列

  1. void release()
  2. {
  3. delete []base;
  4. }

        4.入队列

        

  1. void Enqueue(QElemtype e)
  2. {
  3. if(IsFull())
  4. cout <<"queue have been fulled"<<endl;
  5. this->base[rear] = e;
  6. rear = (rear+1)%MAXSIZE;
  7. }

        5.出队列

  

  1. void Dequeue(QElemtype &e)
  2. {
  3. if(IsEmpty())
  4. cout <<"the queue haven't data"<<endl;
  5. e = base[front];
  6. front = (front+1)%MAXSIZE;
  7. }

还有一些比较简单的操作,例如判断队列是否为空,是否为满,获取队列头元素。这些方法我写到总汇里面(第四部分)里面去了。 

四、代码整合        

在实例中用C++类模板的方法整合所有代码,可以调用类直接使用类的接口函数。

1

、顺序结构

  1. #ifndef QUEUE_H_
  2. #define QUEUE_H_
  3. #define MAXSIZE 5
  4. #include<cstdlib>
  5. #include<iostream>
  6. using std::cout;
  7. using std::endl;
  8. template<class T>
  9. class Queue
  10. {
  11. private:
  12. T* base;
  13. int front;
  14. int rear;
  15. public:
  16. Queue();
  17. ~Queue();
  18. bool IsEmpty();
  19. bool IsFull();
  20. void Enqueue(T e);
  21. void Dequeue(T &e);
  22. T GetHead();
  23. };
  24. template<class T>
  25. Queue<T>::Queue()
  26. {
  27. this->base = new T[MAXSIZE];
  28. front = rear = 0;
  29. }
  30. template<class T>
  31. Queue<T>::~Queue()
  32. {
  33. delete []base;
  34. }
  35. template<class T>
  36. bool Queue<T>::IsEmpty()
  37. {
  38. if(rear == front)
  39. return true;
  40. else
  41. return false;
  42. }
  43. template<class T>
  44. bool Queue<T>::IsFull()
  45. {
  46. if((rear+1)%MAXSIZE == front)
  47. return true;
  48. else
  49. return false;
  50. }
  51. template<class T>
  52. void Queue<T>::Enqueue(T e)
  53. {
  54. if(IsFull())
  55. cout << "queue have been fulled"<<endl;
  56. this->base[rear] = e;
  57. rear = (rear+1)%MAXSIZE;
  58. }
  59. template<class T>
  60. void Queue<T>::Dequeue(T &e)
  61. {
  62. if(IsEmpty())
  63. cout <<"the queue haven't data"<<endl;
  64. e = base[front];
  65. front = (front+1)%MAXSIZE;
  66. }
  67. template<class T>
  68. T Queue<T>::GetHead()
  69. {
  70. if(front != rear)
  71. return base[front];
  72. }
  73. #endif

二、链式结构

  1. #ifndef QUEUE_H_
  2. #define QUEUE_H_
  3. #define MAXSIZE 100
  4. #include<cstdlib>
  5. typedef int Elemtype;
  6. struct Qnode
  7. {
  8. Elemtype data;
  9. struct Qnode* next;
  10. };
  11. typedef struct Qnode* LinkQueue;
  12. template<class T>
  13. class Queue
  14. {
  15. private:
  16. LinkQueue front;
  17. LinkQueue rear;
  18. public:
  19. Queue();
  20. ~Queue();
  21. void Enqueue(T e);
  22. void Dequeue(T &e);
  23. void GetHead(T &e);
  24. };
  25. template<class T>
  26. Queue<T>::Queue()
  27. {
  28. front = rear = new Qnode[MAXSIZE];
  29. if(!front)
  30. exit(0);
  31. front->next = nullptr;
  32. }
  33. template<class T>
  34. Queue<T>::~Queue()
  35. {
  36. while(front)
  37. {
  38. LinkQueue p = front->next;
  39. delete front;
  40. front = p;
  41. }
  42. }
  43. template<class T>
  44. void Queue<T>::Enqueue(T e)
  45. {
  46. LinkQueue p = new Qnode[MAXSIZE];
  47. if(!p)
  48. exit(0);
  49. p->data = e;
  50. p->next = nullptr;
  51. rear->next = p;
  52. rear = p;
  53. }
  54. template<class T>
  55. void Queue<T>::Dequeue(T &e)
  56. {
  57. if(front == rear)
  58. exit(0);
  59. LinkQueue p = front->next;
  60. e = p->data;
  61. front->next = p->next;
  62. delete p;
  63. }
  64. template<class T>
  65. void Queue<T>::GetHead(T &e)
  66. {
  67. e = front->next->data;
  68. }
  69. #endif

 五、总结

队列这部分更新完了,纯手敲,后面继续写其他的数据结构。

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

闽ICP备14008679号