隊列的基本操作
一、實驗目的
1.掌握隊列的順序存儲結構。
2.掌握隊列先進先出運算原則在解決實際問題中的應用。
3. 掌握自定義數據類型的用法。
二、實驗內容
仿照資料中順序循環隊列的例子,設計一個只使用隊頭指針和計數器的順序循環隊列抽象數據類型。其中操作包括:初始化、入隊列、出隊列、判斷隊列是否非空。編寫主函數,驗證所設計的順序循環隊列的正確性。
以下是隊列操作函數的定義:
(1)QueueInitiate(Q) 初始化隊列Q
(2)QueueNotEmpty(Q) 隊列Q非空否
(3)QueueAppend(Q,x) 入隊列,在隊列Q的隊尾插入數據元素x。
(4)QueueDelete(Q,d) 出隊列,把隊列Q的隊頭元素刪除並由參數d帶回。
提示:隊尾的位置可由隊頭指針與計數器進行求解,請思考它們之間的關係,同時還要考慮如何實現循環隊列(可藉助求模運算)。
頭文件
/*仿照資料中順序循環隊列的例子,設計一個只使用隊頭指針和計數器的順序循環隊列抽象數據類型。
其中操作包括:初始化、入隊列、出隊列、判斷隊列是否非空。編寫主函數,驗證所設計的順序循環隊列的正確性。*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define DateType char
#define MaxSize 10//循環隊列總數
typedef struct{
DateType date[MaxSize];
int front;//隊頭指針
int counter;//計數器
}Queue,*PQueue;
//初始化隊列Q
PQueue QueueInitiate(){
PQueue Q = (PQueue)malloc(sizeof(Queue));
Q->counter = 0;
if(Q){
Q->counter = 0;
Q->front = 0;
}
return Q;
}
//隊列Q非空否
int QueueNotEmpty(PQueue Q){
//空返回1,不空返回0
if(Q->counter==0) return 1;
else return 0;
}
//入隊列,在隊列Q的隊尾插入數據元素x。
void QueueAppend(PQueue Q,DateType x){
//如果隊列不存在,直接返回
// if(!Q){
// return;
// }
//x入隊列
Q->date[(Q->front+Q->counter)%MaxSize] = x;
Q->counter++;
}
//出隊列,把隊列Q的隊頭元素刪除並由參數d帶回。
void QueueDelete(PQueue Q,DateType *d){
*d=Q->date[Q->front];
Q->front=(Q->front+1)%MaxSize;
Q->counter--;
}
測試文件
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"3.3.h"
#define DateType char
#define MaxSize 10
void main(){
int i;
PQueue myQ = QueueInitiate();
DateType myC;
DateType arr[10]={'a','b','c','d','e','f','g','h','i',};
for(i=0;i<10;i++){
QueueAppend(myQ,arr[i]);
}
printf("如果接下來輸出a-i,則正常\n");
for(i=0;i<10;i++){
QueueDelete(myQ,&myC);
printf("%c\t",myC);
}
//下面從隊列第10位開始輸入,測試循環性
for(i=0;i<10;i++){
QueueAppend(myQ,arr[i]);
}
printf("\n如果接下來輸出a-i,則正常\n");
for(i=0;i<10;i++){
QueueDelete(myQ,&myC);
printf("%c\t",myC);
}
//銷燬隊列
free(myQ) ;
myQ=NULL;
}