顺序循环队列

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int Status;
  4. typedef int QElemType;
  5. #define OVERFLOW -1
  6. #define ERROR 0
  7. #define OK 1
  8. #define MAXSIZE 100
  9. /**
  10. * 循环队列——队列的顺序表示和实现
  11. *
  12. * 操作:初始化、队列长度、入队、出队、取队头元素
  13. */
  14. /* 存储形式 */
  15. typedef struct {
  16. QElemType *base;
  17. int front;
  18. int rear;
  19. } SqQueue;
  20. /* 初始化 */
  21. Status InitQueue(SqQueue &queue) {
  22. // 初始化这个base地址为一个有最大容量的数组初地址
  23. queue.base = new int[MAXSIZE];
  24. if (!queue.base) {
  25. return OVERFLOW;
  26. }
  27. queue.front = queue.rear = 0;
  28. return OK;
  29. }
  30. /* 求队列长度 */
  31. Status QueueLength(SqQueue &queue) {
  32. return (queue.rear - queue.front + MAXSIZE) % MAXSIZE;
  33. }
  34. /* 入队 */
  35. Status EnQueue(SqQueue &queue, QElemType e) {
  36. if ((queue.rear+1)%MAXSIZE == queue.front) {
  37. return OVERFLOW;
  38. }
  39. queue.base[queue.rear] = e;
  40. queue.rear = (queue.rear + 1) % MAXSIZE;
  41. return OK;
  42. }
  43. /* 出队 */
  44. Status DeQueue(SqQueue &queue) {
  45. if ((queue.rear+1)%MAXSIZE == queue.front) {
  46. return OVERFLOW;
  47. }
  48. QElemType e = queue.base[queue.front];
  49. queue.front = (queue.front + 1) % MAXSIZE; //队头指针+1
  50. return e;
  51. }
  52. /* 取队头元素 */
  53. Status GetHead(SqQueue &queue) {
  54. if (queue.front != queue.rear) {
  55. return queue.base[queue.front];
  56. }
  57. }
  58. int main() {
  59. SqQueue test;
  60. InitQueue(test);
  61. EnQueue(test, 10);
  62. EnQueue(test, 15);
  63. EnQueue(test, 20);
  64. cout << "队列长度为:" << QueueLength(test) << "\n";
  65. cout << GetHead(test)<<" "<< GetHead(test)<<" "<< GetHead(test)<<" "<<"\n";
  66. cout << DeQueue(test)<<" "<< DeQueue(test)<<" "<< DeQueue(test)<<" "<<"\n";
  67. }

链队

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int Status;
  4. typedef int QElemType;
  5. #define OVERFLOW -1
  6. #define ERROR 0
  7. #define OK 1
  8. #define MAXSIZE 100
  9. /**
  10. * 链队——队列的链式表示和实现
  11. *
  12. * 操作:初始化、入队、出队、取队头元素
  13. */
  14. /* 存储形式 */
  15. typedef struct QNode{ //链队用的结点
  16. QElemType data;
  17. struct QNode *next;
  18. }QNode,*QueuePtr;
  19. typedef struct {
  20. QueuePtr front;
  21. QueuePtr rear;
  22. }LinkQueue;
  23. /* 初始化 */
  24. Status InitQueue(LinkQueue &queue) {
  25. queue.front = queue.rear = new QNode;
  26. queue.front->next = NULL;
  27. return OK;
  28. }
  29. /* 入队 */
  30. Status EnQueue(LinkQueue &queue, QElemType e) {
  31. QueuePtr temp = new QNode;
  32. temp->data = e;
  33. temp->next = NULL;
  34. queue.rear->next = temp;
  35. queue.rear = temp;
  36. return OK;
  37. }
  38. /* 出队 */
  39. Status DeQueue(LinkQueue &queue) {
  40. if (queue.front == queue.rear) {
  41. return OVERFLOW;
  42. }
  43. QElemType e = queue.front->next->data;
  44. queue.front->next = queue.front->next->next;
  45. // 考虑最后一个元素被删,队尾指针指向头结点
  46. if (queue.rear == queue.front) {
  47. queue.front = queue.rear;
  48. }
  49. return e;
  50. }
  51. /* 取队头元素 */
  52. Status GetHead(LinkQueue &queue) {
  53. if (queue.front != queue.rear){
  54. return queue.front->next->data;
  55. }
  56. }
  57. int main() {
  58. LinkQueue test;
  59. InitQueue(test);
  60. EnQueue(test, 10);
  61. EnQueue(test, 15);
  62. EnQueue(test, 20);
  63. // cout << "队列长度为:" << QueueLength(test) << "\n";
  64. cout << GetHead(test)<<" "<< GetHead(test)<<" "<< GetHead(test)<<" "<<"\n";
  65. cout << DeQueue(test)<<" "<< DeQueue(test)<<" "<< DeQueue(test)<<" "<<"\n";
  66. }