当前位置:   article > 正文

循环队列和链队列的表示和实现_栈和队列实现循环队列队列中元素类型elemtype为char

栈和队列实现循环队列队列中元素类型elemtype为char

目录

一.队列的定义和特点

 二.队列的表示和实现

1.循环队列的表示和实现

1.1循环队列的表示

1.2循环队列的初始化

1.3求队列长度

1.4入队

1.5出队

1.6取队头元素

1.7遍历循环队列(从队头开始)

1.8完整代码

2.链队的表示和实现

2.1链队的表示

2.2初始化链队

 2.3入队

2.4出队

2.5取队头元素

2.6遍历链队

2.7完整代码


一.队列的定义和特点

和栈相反,队列是一种先进先出的线性表。它只允许在表的一端进行插入(一般称队尾),而在另一端删除元素(一般称队头)。可以将队列类比成一个只允许一个人同时通过的隧道,只有前面的人走出后,后面的人才能通过。

 

 注意Q.rear指向的空间是没有元素的。

 二.队列的表示和实现

1.循环队列的表示和实现

1.1循环队列的表示

顺序栈类似,在队列的存储结构中,用一组地址连续的单元依次存放队列元素。设队头指针front和队尾指针rear来分别指示队头和队尾元素。

  1. #define MAXSIZE 100
  2. #define ERROR -1
  3. #define OK 1
  4. #define OVERFLOW 0
  5. #define ElemType char
  6. typedef struct
  7. {
  8. ElemType *base;
  9. int front;
  10. int rear;
  11. }SqQueue;

因为顺序表结构本身的局限性,会出现空间浪费或溢出的情况。为了解决这一问题,我们采用循环队列的方式。同时为了区分队满和队空的条件,规定少用一个空间,即队列有N个空间时,有N-1个元素就认为队满。

1.2循环队列的初始化

  1. int InitQueue(SqQueue &Q){
  2. Q.base=new ElemType[MAXSIZE];
  3. if(!Q.base) exit(OVERFLOW);
  4. Q.front=0;
  5. Q.rear=0;
  6. return OK;
  7. }

循环队列的初始化与普通队列一样,仅需分配一组连续的存储空间,并将队头队尾指针置为0。

1.3求队列长度

  1. int QueueLength(SqQueue Q)
  2. {
  3. return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
  4. }

因为循环队列可能会出现Q.rear<Q.front的情况,所以不能像普通队列那样直接返回Q.rear-Q.front。而是加上MAXSIZE再取模。同下面的代码:

  1. int QueueLength(SqQueue Q)
  2. {
  3. if(Q.rear>=Q.front) return Q.rear-Q.front;
  4. else return Q.rear-Q.front+MAXSIZE;
  5. }

1.4入队

  1. int EnQueue(SqQueue &Q,ElemType e){
  2. if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;
  3. Q.base[Q.rear]=e;
  4. Q.rear=(Q.rear+1)%MAXSIZE;
  5. return OK;
  6. }

入队仅需将元素存进Q.rear指向的空间后,将队尾指针加一,如果超出MAXSIZE则模MAXSIZE。注意要先判断队列是否已满,队满的条件是(Q.rear+1)%MAXSIZE==Q.front。

1.5出队

  1. int DeQueue(SqQueue &Q,ElemType &e){
  2. if(Q.rear==Q.front) return ERROR;
  3. e=Q.base[Q.front];
  4. Q.front=(Q.front+1)%MAXSIZE;
  5. return 0;
  6. }

出队列的操作与入队列相似,区别在于修改的指针为Q.front。注意要先判断队列是否为空,队空的条件是Q.rear==Q.front。

1.6取队头元素

  1. ElemType GetHead(SqQueue &Q){
  2. if(Q.rear!=Q.front)
  3. return Q.base[Q.front];
  4. }

1.7遍历循环队列(从队头开始)

  1. void Traverse(SqQueue Q){
  2. while(Q.front!=Q.rear){
  3. cout<<Q.base[Q.front]<<"\n";
  4. Q.front=(Q.front+1)%MAXSIZE;
  5. }
  6. }

1.8完整代码

  1. #include<iostream>
  2. using namespace std;
  3. #define MAXSIZE 100
  4. #define OK 1
  5. #define ERROR -1
  6. #define OVERFLOW 0
  7. #define Status int
  8. #define ElemType char
  9. typedef struct{
  10. ElemType *base;
  11. int front;
  12. int rear;
  13. }SqQueue;
  14. Status InitQueue(SqQueue &Q);
  15. Status EnQueue(SqQueue &Q,ElemType e);
  16. Status DeQueue(SqQueue &Q,ElemType &e);
  17. ElemType GetHead(SqQueue Q);
  18. void Traverse(SqQueue Q);
  19. int main(){
  20. int n;
  21. ElemType e;
  22. SqQueue Q;
  23. InitQueue(Q);
  24. cout<<"请输入入队列的元素个数:";
  25. cin>>n;
  26. cout<<"请输入入队列元素:"<<"\n";
  27. while(n--){
  28. cin>>e;
  29. EnQueue(Q,e);
  30. }
  31. Traverse(Q);
  32. return 0;
  33. }
  34. Status InitQueue(SqQueue &Q){
  35. Q.base=new ElemType[MAXSIZE];
  36. if(!Q.base) exit(OVERFLOW);
  37. Q.front=0;
  38. Q.rear=0;
  39. return OK;
  40. }
  41. Status EnQueue(SqQueue &Q,ElemType e){
  42. if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;
  43. Q.base[Q.rear]=e;
  44. Q.rear=(Q.rear+1)%MAXSIZE;
  45. return OK;
  46. }
  47. Status DeQueue(SqQueue &Q,ElemType &e){
  48. if(Q.rear==Q.front) return ERROR;
  49. e=Q.base[Q.front];
  50. Q.front=(Q.front+1)%MAXSIZE;
  51. return 0;
  52. }
  53. ElemType GetHead(SqQueue &Q){
  54. if(Q.rear!=Q.front)
  55. return Q.base[Q.front];
  56. }
  57. void Traverse(SqQueue Q){
  58. while(Q.front!=Q.rear){
  59. cout<<Q.base[Q.front]<<"\n";
  60. Q.front=(Q.front+1)%MAXSIZE;
  61. }
  62. }

2.链队的表示和实现

2.1链队的表示

同带有头指针和尾指针的链表。

  1. #define ERROR -1
  2. #define OK 1
  3. #define OVERFLOW 0
  4. #define ElemType char
  5. typedef struct LinkNode{
  6. ElemType data;
  7. struct LinkNode *next;
  8. }LinkNode;
  9. typedef struct{
  10. LinkNode *front;
  11. LinkNode *rear;
  12. }LinkQueue;

2.2初始化链队

初始化链队就是就是构造一个带有头结点的空队。

  1. int InitQueue(LinkQueue &Q){
  2. Q.front=Q.rear=new LinkNode;
  3. Q.front->next=NULL;
  4. return OK;
  5. }

 2.3入队

  1. int EnQueue(LinkQueue &Q,ElemType e){
  2. LinkNode *p=new LinkNode;
  3. p->data=e;
  4. p->next=NULL;
  5. Q.rear->next=p;
  6. Q.rear=p;
  7. return OK;
  8. }

2.4出队

  1. int DeQueue(LinkQueue &Q,ElemType &e){
  2. LinkNode *p=Q.front->next;
  3. e=p->data;
  4. Q.front->next=p->next;
  5. if(Q.rear==p) Q.front=Q.rear;
  6. delete p;
  7. return OK;
  8. }

注意不能直接释放p,如果出队的是队列中的最后一个元素时,由于p=Q.front->next,此时p会指向Q.rear的位置,直接delete p会丢失Q.rear。

2.5取队头元素

  1. ElemType GetFront(LinkQueue Q){
  2. if(Q.front!=Q.rear)
  3. return Q.front->next->data;
  4. }

2.6遍历链队

  1. void Traverse(LinkQueue Q){
  2. //链队不为空
  3. if(Q.front->next){
  4. cout<<"队列的遍历结果为:"<<endl;
  5. LinkNode *p=Q.front->next;
  6. while(p){
  7. cout<<p->data<<endl;
  8. p=p->next;
  9. }
  10. }
  11. }

2.7完整代码

  1. #include<iostream>
  2. using namespace std;
  3. #define ERROR -1
  4. #define OK 1
  5. #define OVERFLOW 0
  6. #define Status int
  7. #define ElemType char
  8. typedef struct LinkNode{
  9. ElemType data;
  10. struct LinkNode *next;
  11. }LinkNode;
  12. typedef struct{
  13. LinkNode *front;
  14. LinkNode *rear;
  15. }LinkQueue;
  16. Status InitQueue(LinkQueue &Q);
  17. Status EnQueue(LinkQueue &Q,ElemType e);
  18. Status DeQueue(LinkQueue &Q,ElemType &e);
  19. ElemType GetFront(LinkQueue Q);
  20. void Traverse(LinkQueue Q);
  21. int main(){
  22. LinkQueue Q;
  23. InitQueue(Q);
  24. ElemType e;
  25. int n;
  26. cout<<"请输入入队元素个数:";
  27. cin>>n;
  28. while(n--){
  29. cin>>e;
  30. EnQueue(Q,e);
  31. }
  32. Traverse(Q);
  33. //cout<<GetFront(Q);
  34. return 0;
  35. }
  36. Status InitQueue(LinkQueue &Q){
  37. Q.front=Q.rear=new LinkNode;
  38. Q.front->next=NULL;
  39. return OK;
  40. }
  41. Status EnQueue(LinkQueue &Q,ElemType e){
  42. LinkNode *p=new LinkNode;
  43. p->data=e;
  44. p->next=NULL;
  45. Q.rear->next=p;
  46. Q.rear=p;
  47. return OK;
  48. }
  49. Status DeQueue(LinkQueue &Q,ElemType &e){
  50. LinkNode *p=Q.front->next;
  51. e=p->data;
  52. Q.front->next=p->next;
  53. if(Q.rear==p) Q.front=Q.rear;
  54. delete p;
  55. return OK;
  56. }
  57. ElemType GetFront(LinkQueue Q){
  58. if(Q.front!=Q.rear)
  59. return Q.front->next->data;
  60. }
  61. void Traverse(LinkQueue Q){
  62. if(Q.front->next){
  63. cout<<"队列的遍历结果为:"<<endl;
  64. LinkNode *p=Q.front->next;
  65. while(p){
  66. cout<<p->data<<endl;
  67. p=p->next;
  68. }
  69. }
  70. }

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

闽ICP备14008679号