數據結構——循環隊列(動態分配空間)基本運算

代碼主要來源:【數據結構】【清華大學】【嚴蔚敏】數據結構

循環隊列基本運算以下:
(1)初始化隊列Q
(2)依次進隊列元素a,b,c
(3)隊列爲非空
(4)出隊一個元素a
(5)依次進隊列元素d,e,f
(6)出隊列序列:b c d e f
(7)釋放隊列spa

完整代碼以下:指針

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 10 // 最大隊列長度(對於循環隊列,最大隊列長度要減1),由於要考慮棧滿判斷條件 

typedef char QElemType;
typedef int Status;

typedef struct SqQueue {
	QElemType   *base; 				// 初始化的動態分配存儲空間
	int 		front; 				// 頭指針,若隊列不空,指向隊列頭元素
	int 		rear; 				// 尾指針,若隊列不空,指向隊列尾元素的下一個位置
} SqQueue;

Status InitQueue(SqQueue &Q)
{
	// 構造一個空隊列Q
	Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
	if(!Q.base) // 存儲分配失敗
		exit(OVERFLOW);
	Q.front=Q.rear=0;
	return OK;
}

Status DestroyQueue(SqQueue &Q)
{
	// 銷燬隊列Q,Q再也不存在
	if(Q.base)
		free(Q.base);
	Q.base=NULL;
	Q.front=Q.rear=0;
	return OK;
}

Status QueueEmpty(SqQueue Q)
{
	if(Q.front==Q.rear)
		return TRUE;
	else
		return FALSE;
}

int QueueLength(SqQueue Q)
{
	// 返回Q的元素個數,即隊列的長度
	return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

Status EnQueue(SqQueue &Q,QElemType e)
{
	// 插入元素e爲Q的新的隊尾元素
	if((Q.rear+1)%MAXQSIZE==Q.front) // 隊列滿
		return ERROR;
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return OK;
}

Status DeQueue(SqQueue &Q,QElemType &e)
{
	// 若隊列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK;不然返回ERROR
	if(Q.front==Q.rear) // 隊列空
		return ERROR;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return OK;
}

int main()
{
	SqQueue Q;
	InitQueue(Q);
	char q1[3]={'a','b','c'};
	char q2[3]={'d','e','f'};
	int i;
	char e;
	printf("依次進隊列元素a,b,c\n");
	for(i=0;i<3;i++)
	{
		EnQueue(Q,q1[i]);
	 } 
	 
	if(!QueueEmpty(Q))
	{
		printf("此時棧非空\n"); 
	}
	
	DeQueue(Q,e);
	printf("出隊一個元素:%c\n",e); 
	
	printf("依次進隊列元素d,e,f\n");
	for(i=0;i<3;i++)
	{
		EnQueue(Q,q2[i]);
	 } 
	
	printf("出隊序列爲:");
	while(!QueueEmpty(Q))
	{
		DeQueue(Q,e);
		printf("%c ",e);
	}
	if(DestroyQueue(Q))
	{
		printf("\n釋放隊列成功!"); 
	}
}
相關文章
相關標籤/搜索