如果用一個循環數組表示隊列,並且只設隊列頭指針Front,不設尾指針Rear,而是另設Count記錄隊列中元素個數。請編寫算法實現隊列的入隊和出隊操作。
函數接口定義:
bool AddQ( Queue Q, ElementType X );
ElementType DeleteQ( Queue Q );
其中Queue
結構定義如下:
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
ElementType *Data; /* 存儲元素的數組 */
Position Front; /* 隊列的頭指針 */
int Count; /* 隊列中元素個數 */
int MaxSize; /* 隊列最大容量 */
};
typedef PtrToQNode Queue;
注意:如果隊列已滿,AddQ
函數必須輸出“Queue Full”並且返回false;如果隊列是空的,則DeleteQ
函數必須輸出“Queue Empty”,並且返回ERROR。
裁判測試程序樣例:
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
typedef int ElementType;
typedef enum { addq, delq, end } Operation;
typedef enum { false, true } bool;
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
ElementType *Data; /* 存儲元素的數組 */
Position Front; /* 隊列的頭、尾指針 */
int Count; /* 隊列中元素個數 */
int MaxSize; /* 隊列最大容量 */
};
typedef PtrToQNode Queue;
Queue CreateQueue( int MaxSize )
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
Q->Front = 0;
Q->Count = 0;
Q->MaxSize = MaxSize;
return Q;
}
bool AddQ( Queue Q, ElementType X );
ElementType DeleteQ( Queue Q );
Operation GetOp(); /* 裁判實現,細節不表 */
int main()
{
ElementType X;
Queue Q;
int N, done = 0;
scanf("%d", &N);
Q = CreateQueue(N);
while ( !done ) {
switch( GetOp() ) {
case addq:
scanf("%d", &X);
AddQ(Q, X);
break;
case delq:
X = DeleteQ(Q);
if ( X!=ERROR ) printf("%d is out\n", X);
break;
case end:
while (Q->Count) printf("%d ", DeleteQ(Q));
done = 1;
break;
}
}
return 0;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
4
Del
Add 5
Add 4
Add 3
Del
Del
Add 2
Add 1
Add 0
Add 10
End
輸出樣例:
Queue Empty 5 is out 4 is out Queue Full 3 2 1 0
題目中代碼沒看懂,稀里糊塗寫了一下,就寫對了
代碼:
bool AddQ( Queue Q, ElementType X ) { if(Q->Count == Q->MaxSize) { printf("Queue Full\n"); return false; } Q->Data[(Q->Front + Q->Count++) % Q->MaxSize] = X; return true; } ElementType DeleteQ( Queue Q ) { if(Q->Count == 0) { printf("Queue Empty\n"); return ERROR; } ElementType d = Q->Data[(Q->Front) ++]; (Q->Count) --; (Q->Front) %= Q->MaxSize; return d; }