当前位置:   article > 正文

【数据结构】队列的基本操作_给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用带

给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用带

分别定义两个结构体——数值链队列、头尾结点队

  1. typedef struct Qnode{
  2. QElemType data;
  3. struct Qnode *next;
  4. }Qnode,*QueuePtr;
  1. typedef struct{
  2. Qnode *front;
  3. Qnode *rear;
  4. }LinkQueue;

问题:

1、编写函数,实现链式队列的基本操作;

2、编写函数,实现循环队列的基本操作。

一、各函数代码如下

 解题一:

  1. //链队的初始化
  2. int InitQueue(LinkQueue &Q){
  3. Q.front = Q.rear = new Qnode;//生成一个新结点,队头队尾指针指向此结点
  4. Q.front->next = NULL;//头结点的指针域置空
  5. return 1;
  6. }
  1. //入队
  2. int enQueue(LinkQueue &Q,int e){
  3. Qnode *p = new Qnode;
  4. p->data = e;
  5. p->next = NULL;
  6. Q.rear->next = p;
  7. Q.rear = p;
  8. return 1;
  9. }
  1. //出队
  2. void deQueue(LinkQueue &Q){
  3. int a;
  4. Qnode *temp;
  5. if(Q.front==Q.rear) //队为空,出队失败
  6. {
  7. printf("An empty Queue error!!!!\n");
  8. }
  9. else
  10. {
  11. temp=Q.front->next;
  12. a=temp->data;
  13. Q.front->next=temp->next;
  14. if(Q.front==temp) //如果队中只有一个元素X,则X出队后成为空队
  15. {
  16. Q.rear=Q.front;
  17. }
  18. delete temp; //释放存储空间
  19. printf("队头元素%d,出队成功.\n",a);
  20. }
  21. }
  1. //取队头元素
  2. int getHead(LinkQueue Q){
  3. if(Q.front != Q.rear){
  4. return Q.front->next->data;
  5. }
  6. }
  1. /判断队列为空性
  2. int judgeQueue(LinkQueue Q){
  3. return (Q.rear == Q.front);
  4. }
  1. //链队长度
  2. int queueLength(LinkQueue Q){
  3. int count=0;
  4. Qnode *p=Q.front->next;
  5. while(p!=NULL){
  6. count++;
  7. p=p->next;
  8. }
  9. return count;
  10. }
  1. //遍历队列
  2. void show_queue(LinkQueue Q){
  3. Qnode *p=Q.front->next;
  4. cout<<"当前元素从头到尾:";
  5. while(p!=NULL){
  6. printf("%d ",p->data);
  7. p=p->next;
  8. }
  9. }
  1. //清除队列
  2. void clearQueue(LinkQueue &Q){//除头结点外,对所有结点进行清除
  3. if(Q.front==Q.rear)//如果头指针与尾指针指向相同,则链队为空
  4. return;//无需清除
  5. Qnode *p=Q.front->next;//指针p指向头结点后第一个有效结点
  6. while(p!=NULL)
  7. {
  8. Q.front->next=p->next;//头结点的指针域保存第二个有效结点的地址
  9. delete p;//释放第一个有效结点
  10. p=Q.front->next;//指针p重新指向头结点后第一个有效结点
  11. }
  12. //释放完成后,对尾部指针进行修改
  13. Q.rear=Q.front;//队尾指针指向头结点
  14. }
  1. //销毁队列
  2. void destroyQueue(LinkQueue &Q){//清除的前提下释放头结点实现销毁
  3. clearQueue(Q);
  4. delete Q.front;//释放头结点
  5. Q.front=Q.rear=NULL;//队头和队尾指针都赋空,预防野指针
  6. }
  1. //设置一个选择,实现与用户交互
  2. void switchice(LinkQueue &Q){
  3. int i;
  4. cout<<"\n1.继续出队 2.清空队列元素"<<endl<<"3.销毁队列"<<endl<<"请输入选项:";
  5. cin>>i;
  6. switch(i)
  7. {
  8. case 1:deQueue(Q);break;
  9. case 2:clearQueue(Q); cout<<"清空链队成功!!!"<<endl; break;
  10. case 3:destroyQueue(Q); cout<<"已销毁链队!!!结束所有操作!!!"<<endl; break;
  11. }
  12. if(i==1 || i==2){
  13. switchice(Q);
  14. }
  15. else return;
  16. }

解题一完整代码:
  1. #include <iostream.h>
  2. typedef struct Qnode{
  3. int data;//本项目将对int型数据进行操作
  4. struct Qnode *next;
  5. }Qnode,*QueuePtr;
  6. typedef struct{
  7. Qnode *front;
  8. Qnode *rear;
  9. }LinkQueue;
  10. /*********************各个子函数的定义*********************/
  11. int InitQueue(LinkQueue &Q);//链队的初始化
  12. int enQueue(LinkQueue &Q,int e);//入队
  13. void deQueue(LinkQueue &Q);//出队
  14. int getHead(LinkQueue Q);//取队头元素
  15. int judgeQueue(LinkQueue Q);//判断队列为空性
  16. int queueLength(LinkQueue Q);//链队长度
  17. void show_queue(LinkQueue Q);//遍历队列
  18. void clearQueue(LinkQueue &Q);//清除队列
  19. void destroyQueue(LinkQueue &Q);//销毁队列
  20. void switchice(LinkQueue &Q);//设置一个选择,实现与用户交互
  21. int main()
  22. {
  23. int num,i,e;
  24. LinkQueue Q;
  25. if(InitQueue(Q) != 0){
  26. cout<<"初始化成功!!!"<<endl;
  27. if(judgeQueue(Q)){
  28. cout<<"此队列为空!!!"<<endl;
  29. }
  30. }
  31. cout<<"入队的个数:";
  32. cin>>num;
  33. for(i=0;i<num;i++){
  34. printf("请输入第%d个元素:",i+1);
  35. cin>>e;
  36. enQueue(Q,e);//依次入队
  37. }
  38. cout<<"入队成功!!!"<<endl;
  39. cout<<"队头元素为:"<<getHead(Q)<<endl;
  40. show_queue(Q);//遍历队列并打印
  41. cout<<endl<<"本队列长度为:"<<queueLength(Q)<<endl;
  42. cout<<"\n出队:";
  43. deQueue(Q);
  44. switchice(Q);//含出队,清空链队和销毁链队操作
  45. return 0;
  46. }
  47. /*********************各个子函数功能的实现*********************/
  48. //链队的初始化
  49. int InitQueue(LinkQueue &Q){
  50. Q.front = Q.rear = new Qnode;//生成一个新结点,队头队尾指针指向此结点
  51. Q.front->next = NULL;//头结点的指针域置空
  52. return 1;
  53. }
  54. //入队
  55. int enQueue(LinkQueue &Q,int e){
  56. Qnode *p = new Qnode;
  57. p->data = e;
  58. p->next = NULL;
  59. Q.rear->next = p;
  60. Q.rear = p;
  61. return 1;
  62. }
  63. //出队
  64. void deQueue(LinkQueue &Q){
  65. int a;
  66. Qnode *temp;
  67. if(Q.front==Q.rear) //队为空,出队失败
  68. {
  69. printf("An empty Queue error!!!!\n");
  70. }
  71. else
  72. {
  73. temp=Q.front->next;
  74. a=temp->data;
  75. Q.front->next=temp->next;
  76. if(Q.front==temp) //如果队中只有一个元素X,则X出队后成为空队
  77. {
  78. Q.rear=Q.front;
  79. }
  80. delete temp; //释放存储空间
  81. printf("队头元素%d,出队成功.\n",a);
  82. }
  83. }
  84. //取队头元素
  85. int getHead(LinkQueue Q){
  86. if(Q.front != Q.rear){
  87. return Q.front->next->data;
  88. }
  89. }
  90. //判断队列为空性
  91. int judgeQueue(LinkQueue Q){
  92. return (Q.rear == Q.front);
  93. }
  94. //链队长度
  95. int queueLength(LinkQueue Q){
  96. int count=0;
  97. Qnode *p=Q.front->next;
  98. while(p!=NULL){
  99. count++;
  100. p=p->next;
  101. }
  102. return count;
  103. }
  104. //遍历队列
  105. void show_queue(LinkQueue Q){
  106. Qnode *p=Q.front->next;
  107. cout<<"当前元素从头到尾:";
  108. while(p!=NULL){
  109. printf("%d ",p->data);
  110. p=p->next;
  111. }
  112. }
  113. //清除队列
  114. void clearQueue(LinkQueue &Q){//除头结点外,对所有结点进行清除
  115. if(Q.front==Q.rear)//如果头指针与尾指针指向相同,则链队为空
  116. return;//无需清除
  117. Qnode *p=Q.front->next;//指针p指向头结点后第一个有效结点
  118. while(p!=NULL)
  119. {
  120. Q.front->next=p->next;//头结点的指针域保存第二个有效结点的地址
  121. delete p;//释放第一个有效结点
  122. p=Q.front->next;//指针p重新指向头结点后第一个有效结点
  123. }
  124. //释放完成后,对尾部指针进行修改
  125. Q.rear=Q.front;//队尾指针指向头结点
  126. }
  127. //销毁队列
  128. void destroyQueue(LinkQueue &Q){//清除的前提下释放头结点实现销毁
  129. clearQueue(Q);
  130. delete Q.front;//释放头结点
  131. Q.front=Q.rear=NULL;//队头和队尾指针都赋空,预防野指针
  132. }
  133. //设置一个选择,实现与用户交互
  134. void switchice(LinkQueue &Q){
  135. int i;
  136. cout<<"\n1.继续出队 2.清空队列元素"<<endl<<"3.销毁队列"<<endl<<"请输入选项:";
  137. cin>>i;
  138. switch(i)
  139. {
  140. case 1:deQueue(Q);break;
  141. case 2:clearQueue(Q); cout<<"清空链队成功!!!"<<endl; break;
  142. case 3:destroyQueue(Q); cout<<"已销毁链队!!!结束所有操作!!!"<<endl; break;
  143. }
  144. if(i==1 || i==2){
  145. switchice(Q);
  146. }
  147. else return;
  148. }

 执行效果:



解题二:

  1. //循环队列初始化
  2. Status InitQueue (SqQueue &Q){
  3. Q.base =new QElemType[MAXQSIZE];
  4. if(!Q.base) exit(OVERFLOW);
  5. Q.front=Q.rear=0;
  6. return OK;
  7. }
  1. //销毁队列
  2. void DestroyQueue(SqQueue Q){
  3. delete Q.base;//直接释放队列指针
  4. Q.base = NULL;//重置为NULL
  5. Q.front = Q.rear = 0;//重置为0
  6. }
  1. //清空队列指针,直接使两个标记重置为0
  2. void ClearQueue(SqQueue Q){
  3. Q.front = Q.rear = 0;
  4. }
  1. //循环队列入队
  2. Status EnQueue(SqQueue &Q,QElemType e){
  3. if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
  4. Q.base[Q.rear]=e;
  5. Q.rear=(Q.rear+1)%MAXQSIZE;
  6. return OK;
  7. }
  1. //循环队列出队
  2. Status DeQueue (SqQueue &Q,QElemType &e){
  3. if(Q.front==Q.rear) return ERROR;
  4. e=Q.base[Q.front];
  5. Q.front=(Q.front+1)%MAXQSIZE;
  6. return OK;
  7. }
  1. //判断是否为空
  2. Status QueueEmpty(SqQueue Q){
  3. if(Q.front == Q.rear)
  4. return 1;
  5. else
  6. return 0;
  7. }
  1. //取队头元素
  2. Status GetHead(SqQueue Q){
  3. return *(Q.base + Q.front);
  4. }
  1. //求循环队列的长度
  2. Status QueueLength(SqQueue Q){
  3. return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
  4. }
  1. //遍历队列
  2. void Traverse(SqQueue Q){
  3. if(Q.front == Q.rear)//判断是否为空
  4. return;
  5. cout<<"当前队列为:";
  6. while(Q.front != Q.rear)
  7. {
  8. printf("%d ", *(Q.base + Q.front));//遍历操作,这里是简单的打印输出
  9. Q.front = (Q.front + 1) % MAXQSIZE;//下标后移直到与队尾下标重合,注意这里没有改变两个下标的值,被调函数只是拷贝了一份副本
  10. }
  11. cout<<endl;
  12. }
  1. //设置一个选择,实现与用户交互
  2. void switchice(SqQueue &Q){
  3. int i,e;
  4. cout<<"\n1.继续出队 2.清空队列元素"<<endl<<"3.销毁队列"<<endl<<"请输入选项:";
  5. cin>>i;
  6. switch(i)
  7. {
  8. case 1:DeQueue(Q,e);printf("队头元素%d,出队成功!!!\n", e);break;
  9. case 2:ClearQueue(Q); cout<<"清空队列成功!!!"<<endl; break;
  10. case 3:DestroyQueue(Q); cout<<"已销毁队列!!!结束所有操作!!!"<<endl; break;
  11. }
  12. if(i==1 || i==2){
  13. switchice(Q);
  14. }
  15. else return;
  16. }

解题二完整代码:

  1. #include<iostream.h>
  2. #include<stdio.h>
  3. #define MAXQSIZE 100 //最大队列长度
  4. #define ERROR 0
  5. #define OK 1
  6. #define OVERFLOW -2
  7. typedef int Status;
  8. typedef int QElemType;
  9. typedef struct {
  10. QElemType *base; //初始化的动态分配存储空间
  11. int front; //头指针
  12. int rear; //尾指针
  13. }SqQueue;
  14. /*********************各个子函数的定义*********************/
  15. Status InitQueue (SqQueue &Q);//循环队列初始化
  16. void DestroyQueue(SqQueue Q);//销毁队列
  17. void ClearQueue(SqQueue Q);//清空队列指针,直接使两个标记重置为0
  18. Status EnQueue(SqQueue &Q,QElemType e);//循环队列入队
  19. Status DeQueue (SqQueue &Q,QElemType &e);//循环队列出队
  20. Status QueueEmpty(SqQueue Q);//判断是否为空
  21. Status GetHead(SqQueue Q);//取队头元素
  22. Status QueueLength(SqQueue Q);//求循环队列的长度
  23. void Traverse(SqQueue Q);//遍历队列
  24. void switchice(SqQueue &Q);//设置一个选择,实现与用户交互
  25. int main()
  26. {
  27. QElemType e,i,num,*s;//*s为取队头元素指针
  28. SqQueue Q;
  29. if(InitQueue(Q)==1){
  30. cout<<"循环队列初始化成功!!!"<<endl;
  31. }
  32. if(QueueEmpty(Q)==1){
  33. cout<<"此队列为空!!!"<<endl;
  34. }
  35. else{
  36. cout<<"此队列不为空!!!"<<endl;
  37. }
  38. cout<<"入队个数:";
  39. cin>>num;
  40. for(i=0;i<num;i++){
  41. printf("请输入第%d个元素:",i+1);
  42. cin>>e;
  43. EnQueue(Q,e);//依次入队
  44. }
  45. Traverse(Q);//遍历队列
  46. cout<<"当前队头元素为:"<<GetHead(Q)<<endl;
  47. cout<<"出队:";
  48. DeQueue(Q,e);//出队
  49. printf("队头元素%d,出队成功!!!\n", e);
  50. switchice(Q);
  51. }
  52. /*********************各个子函数功能的实现*********************/
  53. //循环队列初始化
  54. Status InitQueue (SqQueue &Q){
  55. Q.base =new QElemType[MAXQSIZE];
  56. if(!Q.base) exit(OVERFLOW);
  57. Q.front=Q.rear=0;
  58. return OK;
  59. }
  60. //销毁队列
  61. void DestroyQueue(SqQueue Q){
  62. delete Q.base;//直接释放队列指针
  63. Q.base = NULL;//重置为NULL
  64. Q.front = Q.rear = 0;//重置为0
  65. }
  66. //清空队列指针,直接使两个标记重置为0
  67. void ClearQueue(SqQueue Q){
  68. Q.front = Q.rear = 0;
  69. }
  70. //循环队列入队
  71. Status EnQueue(SqQueue &Q,QElemType e){
  72. if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
  73. Q.base[Q.rear]=e;
  74. Q.rear=(Q.rear+1)%MAXQSIZE;
  75. return OK;
  76. }
  77. //循环队列出队
  78. Status DeQueue (SqQueue &Q,QElemType &e){
  79. if(Q.front==Q.rear) return ERROR;
  80. e=Q.base[Q.front];
  81. Q.front=(Q.front+1)%MAXQSIZE;
  82. return OK;
  83. }
  84. //判断是否为空
  85. Status QueueEmpty(SqQueue Q){
  86. if(Q.front == Q.rear)
  87. return 1;
  88. else
  89. return 0;
  90. }
  91. //取队头元素
  92. Status GetHead(SqQueue Q){
  93. return *(Q.base + Q.front);
  94. }
  95. //求循环队列的长度
  96. Status QueueLength(SqQueue Q){
  97. return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
  98. }
  99. //遍历队列
  100. void Traverse(SqQueue Q){
  101. if(Q.front == Q.rear)//判断是否为空
  102. return;
  103. cout<<"当前队列为:";
  104. while(Q.front != Q.rear)
  105. {
  106. printf("%d ", *(Q.base + Q.front));//遍历操作,这里是简单的打印输出
  107. Q.front = (Q.front + 1) % MAXQSIZE;//下标后移直到与队尾下标重合,注意这里没有改变两个下标的值,被调函数只是拷贝了一份副本
  108. }
  109. cout<<endl;
  110. }
  111. //设置一个选择,实现与用户交互
  112. void switchice(SqQueue &Q){
  113. int i,e;
  114. cout<<"\n1.继续出队 2.清空队列元素"<<endl<<"3.销毁队列"<<endl<<"请输入选项:";
  115. cin>>i;
  116. switch(i)
  117. {
  118. case 1:DeQueue(Q,e);printf("队头元素%d,出队成功!!!\n", e);break;
  119. case 2:ClearQueue(Q); cout<<"清空队列成功!!!"<<endl; break;
  120. case 3:DestroyQueue(Q); cout<<"已销毁队列!!!结束所有操作!!!"<<endl; break;
  121. }
  122. if(i==1 || i==2){
  123. switchice(Q);
  124. }
  125. else return;
  126. }

执行效果:



分享完毕~

欢迎小伙伴们在文下评论和私信喔~

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

闽ICP备14008679号