1. 程式人生 > >資料結構 迴圈佇列的實現

資料結構 迴圈佇列的實現

一、迴圈佇列的實現

由於順序佇列的實現可能會造成假溢位,這裡引入一個迴圈佇列,當然,這裡你要知道資料在佇列中的最大規模,否則迴圈佇列慢之後想拓展就會變得非常麻煩!

要求:

實驗七、實現迴圈佇列各種基本運算的演算法

1 實驗目的

本實驗是要實現迴圈佇列的各種基本運算,通過該實驗更深刻地理解線性結構的佇列的特點。

實驗內容

實現迴圈佇列的各種基本運算,在此基礎上設計一個主程式完成以下功能:

(1) 初始化佇列

(2) 判斷佇列是否非空

(3) 依次進隊元素為學號分解後的數字,學號為20161100進隊元素為數字:20161100

(4) 出隊一個元素,輸出該元素

(5) 依次進隊元素9, 8, 7

(6) 全部元素出隊,輸出出隊序列

(7) 釋放佇列

 具體程式碼實現如下:

#include<stdio.h>
#include<stdlib.h>

//******巨集定義引數******
#define OK 1
#define NO 0
#define QUEUE_MAX_SIZE 20

//******定義資料類型別名******
typedef int Status;
typedef char ElemType;

//******宣告資料結構******
typedef struct node
{
	ElemType *book;
	int front;
	int rear;
	int QueSize;
}SqQueue,*QueuePoint;

QueuePoint InitQueue()
{
	QueuePoint p=(QueuePoint)malloc(sizeof(SqQueue));
	if(p==NULL)
	{
		printf("系統無足夠記憶體申請迴圈佇列頭結點!\n");
		return p;
	}
	p->book=(ElemType *)malloc(QUEUE_MAX_SIZE*sizeof(ElemType));
	p->front=p->rear=0;
	p->QueSize=QUEUE_MAX_SIZE;
	if(p->book == NULL)
		printf("迴圈佇列記憶體分配失敗!\n");
	return p;
}

Status QueueEmpty(QueuePoint Head)
{
	if(Head->front == Head->rear)
		return OK;
	return NO;
}

Status QueuePush(QueuePoint Head,ElemType ch)
{
	if((Head->rear+1)%Head->QueSize == Head->front)
	{
	//	printf("\n對不起,該佇列已滿,無法再插入資料!\n");
		return NO;
	}
	Head->book[Head->rear]=ch;
	Head->rear=(Head->rear+1)%Head->QueSize;
	return OK;
}

Status QueuePop(QueuePoint Head,ElemType *ch)
{
	if(Head->front == Head->rear)
	{
	//	printf("\n對不起,佇列已空!\n");
		return NO;
	}
	*ch=Head->book[Head->front];
	Head->front=(Head->front+1)%Head->QueSize;
	return OK;
}

int main()
{
	QueuePoint Head;
	ElemType ch;
	Head=InitQueue();
	printf("%s\n",QueueEmpty(Head)?"該棧為空!":"該棧非空!");
	while((ch=getchar())!='\n')
		QueuePush(Head,ch);
	QueuePop(Head,&ch);
	printf("%c\n",ch);
	while((ch=getchar())!='\n')
		QueuePush(Head,ch);
	while(QueuePop(Head,&ch))
		printf("%c",ch);
	free(Head->book);
	free(Head);
	printf("\n迴圈佇列操作結束!\n");
	return 0;
}

總結:

迴圈佇列要掌握對佇列長度的計算和公式推理 Length=(Q.rear-Q.front+Q.MaxSize)%Q.MaxSize。