七、C语言实现循环队列的基本功能
1、逻辑图
2、声明
//结构声明
typedef int ElemType;
typedef struct queue
{
int head;
int rear;
int size;
ElemType *data;
}Queue;
//方法声明
//初始化队列
void InitQueue(Queue *que,int init_size);
//判空
bool IsEmpty(Queue *que);
//判满
bool IsFull(Queue *que);
//入队
void PushQueue(Queue *que, ElemType value);
//出队列
void PopQueue(Queue *que);
//输出
void ShowQue();
//求队头元素
void TopElem(Queue *que, ElemType *reval);
//测试
void QueTest();
//销毁队列
void DestoryQue(Queue *que);
//开辟新队列
static bool ApplyNewQue(Queue *que);
3、方法实现
#include "queue.h"
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
//初始化队列
void InitQueue(Queue *que,int init_size)
{
if(que == NULL) exit(0);
init_size = init_size > 0 ? init_size:10;
que->data = (ElemType*)malloc(sizeof(ElemType)*init_size);
if(que->data == NULL) exit(0);
que->head = 0;
que->rear = 0;
que->size = init_size;
}
//判满
bool IsFull(Queue *que)
{
if(que == NULL) exit(0);
if((que->rear+1)%que->size == que->head) return true;
return false;
}
//判空
bool IsEmpty(Queue *que)
{
if(que == NULL) exit(0);
return que->head ==que->rear;
}
//开辟新队列
static bool ApplyNewQue(Queue *que)
{
ElemType *newspace
=(ElemType*)malloc(sizeof(ElemType)*que->size * 2);
if(newspace == NULL) exit(0);
//挪数据
for(int i = 0; i < que->size; i++)
{
newspace[i]=que->data[i];
}
free(que->data);
que->size *= 2;
que->data = newspace;
return true;
}
//入队
void PushQueue(Queue *que, ElemType value)
{
if(que == NULL) exit(0);
if(IsFull(que) && !ApplyNewQue(que)) exit(0);
//尾插
que->data[que->rear++] = value;
}
//出队
void PopQueue(Queue *que)
{
if(que == NULL) exit(0);
if(IsEmpty(que)) exit(0);
que->head++;
que->head %= que->size;
}
//求队列首元素
void TopElem(Queue *que, ElemType *reval)
{
if(que == NULL) exit(0);
*reval = que->data[que->head];
}
//销毁队列
void DestoryQue(Queue *que)
{
if(que == NULL) exit(0);
while(!IsEmpty(que))
{
PopQueue(que);
}
free(que->data);
que->head = 0;
que->rear = 0;
que->size = 0;
}
//输出
void ShowQue(Queue *que)
{
if(que == NULL) exit(0);
while(!IsEmpty(que))
{
ElemType tmp = 0;
TopElem(que,&tmp);
printf("%d ",tmp);
PopQueue(que);
}
printf("\n");
}
//测试
void QueTest()
{
Queue que;
InitQueue(&que,10);
printf("先入队:34 89 23 42 66\n");
PushQueue(&que,34);
PushQueue(&que,89);
PushQueue(&que,23);
PushQueue(&que,42);
PushQueue(&que,66);
printf("在出队两次:");
PopQueue(&que);
PopQueue(&que);
ShowQue(&que);
DestoryQue(&que);
}
4、主函数测试
#include <stdio.h>
#include "queue.h"
int main()
{
QueTest();
return 0;
}
5、测试结果