數據結構:循環隊列(C語言實現)


生活中有非常多隊列的影子,比方打飯排隊,買火車票排隊問題等,能夠說與時間相關的問題,一般都會涉及到隊列問題;從生活中,能夠抽象出隊列的概念,隊列就是一個能夠實現“先進先出”的存儲結構。隊列分為鏈式隊列和靜態隊列;靜態隊列一般用數組來實現,但此時的隊列必須是循環隊列,否則會造成巨大的內存浪費;鏈式隊列是用鏈表來實現隊列的。這里講的是循環隊列,首先我們必須明確以下幾個問題

一、循環隊列的基礎知識

1.循環隊列須要幾個參數來確定

循環隊列須要2個參數,front和rear

2.循環隊列各個參數的含義

(1)隊列初始化時,front和rear值都為零;

(2)當隊列不為空時,front指向隊列的第一個元素,rear指向隊列最后一個元素的下一個位置;

(3)當隊列為空時,front與rear的值相等,但不一定為零;

3.循環隊列入隊的偽算法

(1)把值存在rear所在的位置;

(2)rear=(rear+1)%maxsize ,當中maxsize代表數組的長度;

程序代碼:

bool Enqueue(PQUEUE Q, int val)
{
	if(FullQueue(Q))
		return false;
	else
	{
		Q->pBase[Q->rear]=val;
		Q->rear=(Q->rear+1)%Q->maxsize;
		return true;
	}
}


4.循環隊列出隊的偽算法

(1)先保存出隊的值;

(2)front=(front+1)%maxsize ,當中maxsize代表數組的長度;

程序代碼:

bool Dequeue(PQUEUE Q, int *val)
{
	if(EmptyQueue(Q))
	{
		return false;
	}
	else
	{
		*val=Q->pBase[Q->front];
		Q->front=(Q->front+1)%Q->maxsize;
		return true;
	}
}


5.怎樣推斷循環隊列是否為空

if(front==rear)

隊列空;

else

  隊列不空;

bool EmptyQueue(PQUEUE Q)
{
	if(Q->front==Q->rear)    //推斷是否為空
		return true;
	else
		return false;
}


6.怎樣推斷循環隊列是否為滿


    這個問題比較復雜,如果數組的存數空間為7,此時已經存放1,a,5,7,22,90六個元素了,如果在往數組中加入一個元素,則rear=front;此時,隊列滿與隊列空的推斷條件front=rear同樣,這種話我們就不能推斷隊列究竟是空還是滿了;

解決問題有兩個辦法:一是添加一個參數,用來記錄數組中當前元素的個數;第二個辦法是,少用一個存儲空間,也就是數組的最后一個存數空間不用,當(rear+1)%maxsiz=front時,隊列滿;

bool FullQueue(PQUEUE Q)
{
	if(Q->front==(Q->rear+1)%Q->maxsize)    //推斷循環鏈表是否滿,留一個預留空間不用
		return true;
	else
		return false;
}


附錄:

queue.h文件代碼:

#ifndef __QUEUE_H_
#define __QUEUE_H_
typedef struct queue 
{
	int *pBase;
	int front;    //指向隊列第一個元素
	int rear;    //指向隊列最后一個元素的下一個元素
	int maxsize; //循環隊列的最大存儲空間
}QUEUE,*PQUEUE;

void CreateQueue(PQUEUE Q,int maxsize);
void TraverseQueue(PQUEUE Q);
bool FullQueue(PQUEUE Q);
bool EmptyQueue(PQUEUE Q);
bool Enqueue(PQUEUE Q, int val);
bool Dequeue(PQUEUE Q, int *val);
#endif


queue.c文件代碼:

#include<stdio.h>
#include<stdlib.h>
#include"malloc.h"
#include"queue.h"
/***********************************************
Function: Create a empty stack;
************************************************/
void CreateQueue(PQUEUE Q,int maxsize)
{
	Q->pBase=(int *)malloc(sizeof(int)*maxsize);
	if(NULL==Q->pBase)
	{
		printf("Memory allocation failure");
		exit(-1);        //退出程序
	}
	Q->front=0;         //初始化參數
	Q->rear=0;
	Q->maxsize=maxsize;
}
/***********************************************
Function: Print the stack element;
************************************************/
void TraverseQueue(PQUEUE Q)
{
	int i=Q->front;
	printf("隊中的元素是:\n");
	while(i%Q->maxsize!=Q->rear)
	{
		printf("%d ",Q->pBase[i]);
		i++;
	}
	printf("\n");
}
bool FullQueue(PQUEUE Q)
{
	if(Q->front==(Q->rear+1)%Q->maxsize)    //推斷循環鏈表是否滿,留一個預留空間不用
		return true;
	else
		return false;
}
bool EmptyQueue(PQUEUE Q)
{
	if(Q->front==Q->rear)    //推斷是否為空
		return true;
	else
		return false;
}
bool Enqueue(PQUEUE Q, int val)
{
	if(FullQueue(Q))
		return false;
	else
	{
		Q->pBase[Q->rear]=val;
		Q->rear=(Q->rear+1)%Q->maxsize;
		return true;
	}
}

bool Dequeue(PQUEUE Q, int *val)
{
	if(EmptyQueue(Q))
	{
		return false;
	}
	else
	{
		*val=Q->pBase[Q->front];
		Q->front=(Q->front+1)%Q->maxsize;
		return true;
	}
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM