StaticQueue.c
#include "StaticQueue.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
Queue queue;
Queue* q = &queue;
//-----输入4来测试-----//
InitQueue(q);
//--------入队---------//
if(CheckIsFull(q) != 0)
PushItem(q, 114);
if(CheckIsFull(q) != 0)
PushItem(q, 514);
if(CheckIsFull(q) != 0)
PushItem(q, 1919);
if(CheckIsFull(q) != 0)
PushItem(q, 810);
if(CheckIsFull(q) != 0)
PushItem(q, 114514);
//--------遍历1-------//
TraverseQueue(q);
//--------出队--------//
if(CheckIsEmpty(q) != 0)
printf("出队: %d\n", PopItem(q));
if(CheckIsEmpty(q) != 0)
printf("出队: %d\n", PopItem(q));
if(CheckIsEmpty(q) != 0)
printf("出队: %d\n", PopItem(q));
if(CheckIsEmpty(q) != 0)
printf("出队: %d\n", PopItem(q));
if(CheckIsEmpty(q) != 0)
printf("出队: %d\n", PopItem(q));
TraverseQueue(q);
//------析构测试-----//
DestroyQueue(q);
DestroyQueue(q);
InitQueue(q);
DestroyQueue(q);
return 0;
}
StaticQueue.h
#ifndef STATIC_QUEUE_H
#define STATIC_QUEUE_H
#define _DEBUG_
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
typedef struct StaticQueue {
unsigned int length;
unsigned int maxLength;
int* elements;
int firstIndex;
int lastIndex;
} Queue;
int PopItem(Queue*);
void InitQueue(Queue*);
void TraverseQueue(Queue*);
void DestroyQueue(Queue*);
int PushItem(Queue*, int);
int CheckIsFull(Queue*);
int CheckIsEmpty(Queue*);
void InitQueue(Queue* queue) {
int maxLength;
printf("请输入该队列的最大元素数量: ");
scanf("%d", &maxLength);
queue->maxLength = maxLength;
queue->elements = (int*)malloc(sizeof(int)* maxLength);
#ifdef _DEBUG_
printf("初始化队列成功,最大长度为: %d\n", maxLength);
#endif
queue->length = 0;
queue->firstIndex = 0;
queue->lastIndex = 0;
}
int CheckIsFull(Queue* queue) {
if(queue == NULL || queue->elements == NULL){
printf("内存错误\n");
return -2;
}
if(queue->length < queue->maxLength) {
return -1;
} else {
return 0;
}
}
int CheckIsEmpty(Queue* queue) {
if(queue == NULL || queue->elements == NULL){
printf("内存错误\n");
return -2;
}
if(queue->length != 0) {
return -1;
} else {
return 0;
}
}
int PushItem(Queue* queue, int item) {
if(queue == NULL || queue->elements == NULL){
printf("内存错误\n");
return -2;
}
if(queue->length == queue->maxLength) {
return -1;
} else {
queue->elements[queue->lastIndex] = item;
queue->lastIndex = (queue->lastIndex + 1) % queue->maxLength;
queue->length++;
return 0;
}
}
int PopItem(Queue* queue) {
if(queue == NULL || queue->elements == NULL){
printf("内存错误\n");
return -2;
}
if(CheckIsEmpty(queue) == 0) {
return -1;
} else {
int poppedItem = queue->elements[queue->firstIndex];
queue->elements[queue->firstIndex] = 0;
queue->firstIndex = (queue->firstIndex + 1) % queue->maxLength;
queue->length--;
return poppedItem;
}
}
void TraverseQueue(Queue* queue) {
if(queue == NULL || queue->elements == NULL){
printf("内存错误\n");
return ;
}
int index = queue->firstIndex;
printf("队列内容: ");
#ifdef _DEBUG_
printf("[first]:%d [last]:%d ", queue->firstIndex, queue->lastIndex);
#endif
int cnt = 0;
while (cnt < queue->length) {
printf("%d", queue->elements[index]);
#ifdef _DEBUG_
printf("[%d]", index);
#endif
putchar(' ');
index = (index + 1) % queue->maxLength;
cnt++;
}
putchar('\n');
return ;
}
void DestroyQueue(Queue* queue) {
if(queue == NULL || queue->elements == NULL){
printf("内存错误\n");
return ;
}
//memset(queue->elements, 0, sizeof(int)*queue->maxLength);
free(queue->elements);
queue->elements = NULL;
#ifdef _DEBUG_
printf("队列析构完成\n");
#endif
}
#endif