1. 程式人生 > >資料結構中迴圈佇列的清空、銷燬、求隊長、遍歷、取首元素等操作及運用

資料結構中迴圈佇列的清空、銷燬、求隊長、遍歷、取首元素等操作及運用

資料結構中佇列有好幾種形式,本文寫的是迴圈佇列,以下為原創程式碼。建立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;
}