C语言 数据结构之静态队列

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

发布了24 篇原创文章 · 获赞 14 · 访问量 6149

猜你喜欢

转载自blog.csdn.net/qq_35587463/article/details/102485224