/*
*循環隊列的創建
*循環隊列的初始化
*創建一個一維數組
*操作 出隊 入隊 判對列空 對列滿
*創建數據域結構體
*創建循環隊列的結構體
*求循環隊列的長度
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 1024 //循環隊列的最大長度
#define NAMESIZE 255//字符串的最大長度
int count=0;//外部變量 記錄隊列的元素的個數
typedef int IdType;//數據域的編號的數據類型
typedef char*NameTyp;//數據域的名稱指針
typedef int Statu;//函數的返回值數據類型
typedef struct elementtype
{
IdType id;//數據域的編號
NameTyp name;//數據域的名稱
}ElementType;//數據域的結構體
typedef struct seqqueue
{
ElementType *data;//循環對列的順序存儲
int rear;//尾指針
int front;//頭指針
}Seq_Queue;//循環隊列的結構體
int length_seqqueue(Seq_Queue*q);//循環隊列的長度
Statu empty_seqqueue(Seq_Queue*q);//判空
Statu full_seqqueue(Seq_Queue*q);//判滿
Statu create_seqqueue(Seq_Queue*q);//創建循環隊列
void Init_seqqueue(Seq_Queue*q);//循環隊列的初始化
Statu pop_seqqueue(Seq_Queue*q,ElementType *data);//出隊
Statu push_seqqueue(Seq_Queue*q,ElementType *data);//入隊
Statu getdata_seqqueue(Seq_Queue*q,ElementType *data);//取隊頭元素
void Display_seqqueue(Seq_Queue*q);//遍歷隊列的元素
void main()
{
Seq_Queue *q;
ElementType data;//出隊元素
ElementType data1;//入隊元素
ElementType key;//取棧頂元素
q=(Seq_Queue*)malloc(sizeof(Seq_Queue));
//對隊列進行初始化
Init_seqqueue(q);
//對循環隊列進行創建
int result=create_seqqueue(q);
if(result==ERROR)
printf("循環隊列創建失敗\n");
else
{
printf("循環隊列創建成功\n");
printf("循環隊列元素的個數爲%d\n",count);
}
if(full_seqqueue(q))
printf("隊列爲滿\n");
else
printf("隊列未滿\n");
if(empty_seqqueue(q))
printf("循環隊列爲空\n");
else
{
printf("循環隊列不爲空\n");
printf("循環對列的長度爲%d\n",length_seqqueue(q));
}
data.name=(NameTyp)malloc(sizeof(char)*NAMESIZE);
int result1=pop_seqqueue(q,&data);
if(result1==ERROR)
printf("出隊失敗\n");
else
{
printf("出隊成功\n");
printf("出隊的元素爲[%d,%s]\n",data.id,data.name);
}
key.name=(NameTyp)malloc(sizeof(char)*MAXSIZE);
int result3=getdata_seqqueue(q,&key);
if(result3==ERROR)
printf("取棧頂元素失敗\n");
else
{
printf("取棧頂元素成立\n");
printf("棧頂元素爲[%d,%s]\n",key.id,key.name);
}
data1.name=(NameTyp)malloc(sizeof(char)*NAMESIZE);
data1.id=rand()%30;
printf("請輸入要入隊元素的名稱\n");
scanf("%s",data1.name);
int result2=push_seqqueue(q,&data1);
if(result2==ERROR)
printf("入隊失敗\n");
else
printf("入隊成功\n");
printf("隊列元素的遍歷的結果爲\n");
Display_seqqueue(q);
}
void Init_seqqueue(Seq_Queue*q)//循環隊列的初始化
{
if(q==NULL)
printf("循環隊列初始化失敗\n");
else
{
q->data=(ElementType*)malloc(sizeof(ElementType)*MAXSIZE);//創建順序儲存結構
q->front=0;
q->rear=0;
}
}
Statu create_seqqueue(Seq_Queue*q)//創建循環隊列
{
char name[NAMESIZE];
if(q==NULL)
{
return ERROR;
}
printf("請輸入數據的名稱\n");
while(scanf("%s",name)!=EOF)
{
if(strcmp(name,"^")==0)
break;
else
{
q->data[q->rear].name=(NameTyp)malloc(sizeof(char)*NAMESIZE);
strcpy(q->data[q->rear].name,name);
q->data[q->rear].id=rand()%50;//隨機函數
q->rear=(q->rear+1)%MAXSIZE;
count++;
}
}
return OK;
}
Statu empty_seqqueue(Seq_Queue *q)//判空
{
if(q->rear==q->front)
return OK;
else
return ERROR;
}
Statu full_seqqueue(Seq_Queue*q)//判滿
{
if((q->rear+1)%MAXSIZE==q->front)//避免rear指針位於隊列最一個下標的位置
return OK;
else
return ERROR;
}
int length_seqqueue(Seq_Queue*q)//循環隊列的長度
{
//判斷隊列是否爲空
if(empty_seqqueue(q))
return ERROR;
else
{
return ((q->rear-q->front+MAXSIZE)%MAXSIZE);
}
}
Statu pop_seqqueue(Seq_Queue*q,ElementType *data)//出隊
{
if(empty_seqqueue(q))
return ERROR;
else
{
strcpy(data->name,q->data[q->front].name);
data->id=q->data[q->front].id;
q->front=(q->front+1)%MAXSIZE;//將front指針前移動一個位置
return OK;
}
}
Statu push_seqqueue(Seq_Queue*q,ElementType*data)//入隊
{
//判斷隊列是否爲滿
if(full_seqqueue(q))
return ERROR;
else
{
q->data[q->rear].name=(NameTyp)malloc(sizeof(char)*MAXSIZE);
strcpy(q->data[q->rear].name,data->name);
q->data[q->rear].id=data->id;
q->rear=(q->rear+1)%MAXSIZE;
return OK;
}
}
Statu getdata_seqqueue(Seq_Queue*q,ElementType *data)//取隊頭元素
{
if(empty_seqqueue(q))
return ERROR;
else
{
data->id=q->data[q->front].id;
strcpy(data->name,q->data[q->front].name);
return OK;
}
}
void Display_seqqueue(Seq_Queue*q)//遍歷隊列的元素
{
//對其進行判空
if(empty_seqqueue(q))
return ERROR;
else
{
while(empty_seqqueue(q)!=1)
{
ElementType data;
data.name=(NameTyp)malloc(sizeof(char)*MAXSIZE);
pop_seqqueue(q,&data);
printf("[%d,%s]\t",data.id,data.name);
}
}
}