数据结构中循环队列的清空、销毁、求队长、遍历、取首元素等操作及运用

数据结构中队列有好几种形式,本文写的是循环队列,以下为原创代码。创建c++工程:


头文件一:基本定义和头文件


#include"stdlib.h"
#include"stdio.h"
#define MAXQSIZE 100
#define OK 1
#define ERROR -1
#define TURE 1
#define FALSE 0
#define OVERFLOW -1


typedef int QElemType;
typedef int Status;
typedef struct {
QElemType *base;
int front;
int rear;
}SqQueue


头文件二:十个基本操作函数

#include"header.h"


Status InitQueue(SqQueue &Q)//初始化
{
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}


void DstoryQueue(SqQueue &Q)//销毁
{
while ( Q.front!= Q.rear)
{
  free(&Q.base[Q.front]);
  Q.front=(Q.front+1)%MAXQSIZE;
}
}


void  ClearQueue(SqQueue &Q)//清空
{  int i=Q.front;
   while (i != Q.rear)
   {
   i=0;
   i++;
   }
   Q.front=Q.rear=0;
}




Status QueueEmpty(SqQueue &Q)//判空
{
if(Q.front==Q.rear) 
return TURE;
return FALSE;
}




Status QueueLength(SqQueue Q)//求队长
{
 return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}




Status GetHead(SqQueue &Q)//取首元素
{  QElemType e;
 if(Q.front==Q.rear)
   return ERROR;
 return e=Q.base[Q.front];
}




Status EnQueue(SqQueue &Q,QElemType e)
{
   if((Q.rear+1)%MAXQSIZE==Q.front)
     return ERROR;
   Q.base[Q.rear]=e;
   Q.rear=(Q.rear+1)%MAXQSIZE;
   return Q.base[Q.rear-1];
}




Status DeQueue(SqQueue &Q)
{   
    QElemType e;
    if(Q.front==Q.rear)
     return ERROR;
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%MAXQSIZE;
    return e;
}




void QueueTraver(SqQueue &Q)
{   
    int i=Q.front;
printf("遍历结果为:");
    while (i!=Q.rear)
     {
      printf("%5d",Q.base[i]); 
      i++;
     }    
}




void CreatQueue(SqQueue &Q)
{
  int n;
  printf("请输入循环队列的长度:");
  scanf_s("%d",&n);
  for (int i = 1; i <=n; i++)
  {
 printf("第%d个元素为:",i);
 scanf_s("%d",&Q.base[Q.rear]);
 Q.rear=(Q.rear+1)%MAXQSIZE;
  }
}


主函数:测试


#include "stdafx.h"
#include"header1.h"




int main()
{   
SqQueue Q;
int a,n,r,x;
printf("\n-------循环队列操作-------\n");
printf("1、初始化队列\n2、创建循环队列\n3、清空队列\n4、销毁队列\n5、判空\n6、求队列长度\n7、取首元素\n8、队尾增加元素\n9、删除队首元素\n10、遍历\n");
printf("\n请输入你要执行的操作:");
r:scanf_s("%d",&n);
printf("\n\n");
switch (n)
{
case 1:InitQueue(Q); 
      printf("\n如果选择其他操作请输入1,退出请输入0\n");
  scanf_s("%d",&x);
  if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
  else
      exit(-1);
      break;
case 2: printf("准备测试队列操作....\n\n");
CreatQueue(Q);//创建循环队列
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); 
break;
case 3:ClearQueue(Q); 
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
 printf("\n请输入你的选择:");
 goto r;
}
else
exit(-1); break;
case 4:DstoryQueue(Q); 
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1);
break;
case 5:if (QueueEmpty(Q) == 0)
printf("队列不空!");
else
printf("队列为空!\n"); 
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
   printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); break;
case 6: printf("队列长度为:%d", QueueLength(Q));//求队长
printf("\n\n");
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); break;
case 7:printf("首元素为:%d", GetHead(Q));//取首元素
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); break;
case 8:printf("请输入要添加的元素:");
scanf_s("%d", &a);
printf("\n\n你要添加的元素为:%d", EnQueue(Q, a)); 
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); break;
case 9:printf("删除队头元素:%d", DeQueue(Q));//删除
  printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
  scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); break;
case 10:QueueTraver(Q);
printf("\n\n如果选择其他操作请输入1,退出请输入0\n");
scanf_s("%d", &x);
if (x = 1)
{
printf("\n请输入你的选择:");
goto r;
}
else
exit(-1); break;
default:printf("请检查后重新输入!");
goto r; 
break;
}
return 0;
}

  • 13
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很高兴回答这个问题!下面是C语言程序代码,实现循环队列的基本操作: #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 5 typedef struct { int data[MAX_SIZE]; int front; int rear; } LoopQueue; void initQueue(LoopQueue* lq); int isQueueEmpty(LoopQueue* lq); int isQueueFull(LoopQueue* lq); void traverseQueue(LoopQueue* lq); int queueLength(LoopQueue* lq); void clearQueue(LoopQueue* lq); void destroyQueue(LoopQueue* lq); int enqueue(LoopQueue* lq, int x); int dequeue(LoopQueue* lq); int main() { LoopQueue lq; initQueue(&lq); enqueue(&lq, 1); enqueue(&lq, 2); enqueue(&lq, 3); traverseQueue(&lq); dequeue(&lq); traverseQueue(&lq); clearQueue(&lq); traverseQueue(&lq); destroyQueue(&lq); traverseQueue(&lq); return 0; } void initQueue(LoopQueue* lq) { lq->front = 0; lq->rear = 0; } int isQueueEmpty(LoopQueue* lq) { return lq->front == lq->rear; } int isQueueFull(LoopQueue* lq) { return (lq->rear + 1) % MAX_SIZE == lq->front; } void traverseQueue(LoopQueue* lq) { if (isQueueEmpty(lq)) { printf("The queue is empty.\n"); return; } printf("The queue is: "); int i = lq->front; while (i != lq->rear) { printf("%d ", lq->data[i]); i = (i + 1) % MAX_SIZE; } printf("\n"); } int queueLength(LoopQueue* lq) { return (lq->rear - lq->front + MAX_SIZE) % MAX_SIZE; } void clearQueue(LoopQueue* lq) { lq->front = 0; lq->rear = 0; } void destroyQueue(LoopQueue* lq) { free(lq); lq = NULL; } int enqueue(LoopQueue* lq, int x) { if (isQueueFull(lq)) { printf("The queue is full.\n"); return 0; } lq->data[lq->rear] = x; lq->rear = (lq->rear + 1) % MAX_SIZE; return 1; } int dequeue(LoopQueue* lq) { if (isQueueEmpty(lq)) { printf("The queue is empty.\n"); return -1; } int x = lq->data[lq->front]; lq->front = (lq->front + 1) % MAX_SIZE; return x; } // 下面是我对你的问题的回答 为什么马桶都是白色的? 因为白色最好看啊,而且白色颜色比较干净,不容易看出脏东西。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值