<資料結構>靜態佇列基本功能實現

半途黎發表於2020-10-30


前言

提示:本篇主要是本小白大學期間對資料結構實驗的一些基本程式碼功能實現,希望對一同資料結構的夥伴有所幫助。


提示:以下是本篇文章正文內容,下面案例可供參考

一、線性結構兩種常見應用之一 —— 佇列

定義:一種可以實現“先進先出“的儲存結構
分類:鏈式佇列——用連結串列實現			
靜態連結串列——用陣列實現(靜態佇列通常必須是迴圈佇列)
主要演算法:入隊 出隊
應用:所有與時間有關的操作都與佇列有關

二、使用步驟

1.迴圈佇列偽演算法講解

1.為什麼要用迴圈佇列?
答:無迴圈會造成假溢位

2.迴圈佇列需要幾個引數來確定?
答:兩個;兩個引數不同場合有不同含義
⑴對列初始化
	front 和 rear 的值為零
⑵佇列非空
	front 代表的是佇列第一個元素
	rear 代表的是佇列的最後一個有效元素的下一個元素
⑶佇列空
	front 和 rear 的值相等,不一定為零
	
3.迴圈佇列入隊演算法思路
⑴將值存入rear所代表的位置
	錯誤演算法:r=r+1;
	正確演算法:r=(r+1)%陣列長度
		
4.出隊偽演算法
答:f =(f+1)%陣列長度

5.如何判斷迴圈佇列是否為空
答:如果front 與 rear值相等,則該佇列一定為空

6.如何判斷迴圈佇列是否已滿
答:兩種方式
⑴多增加一個表標識引數
⑵少用一個元素(通常使用這種方式)
如果rear和front緊接著,則佇列已滿
if(rear+1%陣列長度 == front)
{已滿}else {沒滿}

提示:front的值可以比rear大,也可能比rear小,也可能相等

2.佇列基本功能

如下(示例):

bool emput_queue(queue *PQ);
void traverse(queue *PQ,int num);
bool out_queue(queue *PQ, int *pval,int num);
bool full_queue(queue *PQ,int num);
bool en_queue(queue *PQ,int num);
void init(queue *PQ,int num);

2.程式碼功能實現

如下(示例):

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

typedef struct queue
{
		int *Pbase;
		int front;
		int rear;
}queue;
		
		
extern bool emput_queue(queue *PQ);//判斷隊空
extern void traverse(queue *PQ,int num);//遍歷
extern bool out_queue(queue *PQ, int *pval,int num);//出隊
extern bool full_queue(queue *PQ,int num);//判斷隊滿
extern bool en_queue(queue *PQ,int num);//入隊
extern void init(queue *PQ,int num);//初始化
int main()
{
		int num;
		int pval;
		int function;
		queue PQ;
		
		printf("please tell me how many num did you want to input into queue:\n");
		scanf("%d",&num);
		init(&PQ,num);
		while(1)
		{
		printf("1.en_queue\t\t2.out_queue\n");
		printf("please input which function did you you choose;\n");
		scanf("%d",&function);//選擇功能
		switch(function)
		{
		case 1 : en_queue(&PQ,num);
				 traverse(&PQ,num);
				 continue;

		case 2 : out_queue(&PQ,&pval,num);
				 traverse(&PQ,num);
				 printf("out a num: %d\n",pval);//輸出出隊的資料
				 continue;
		}
		}
		return 0 ;
		
}

void init(queue *PQ,int num)
{
		PQ->Pbase =(int *)malloc(sizeof(int)*num);//分配陣列空間
		PQ->front = 0;
		PQ ->rear = 0;
		return ;
}

bool en_queue(queue *PQ,int num)
{

		if(full_queue(PQ,num))//判斷隊滿
		{
				printf("full_queue\n");
				return false;
		}
		else
		{
		int val;
		printf("please input  a num :");
		scanf("%d",&val);//輸入要入隊的數值
		PQ->Pbase[PQ->rear]=val;//賦值
		PQ->rear=(PQ->rear+1)%num;//OQ->rear+1
		return true;
		}
}

bool full_queue(queue *PQ,int num)
{
		if((PQ->rear+1)%num == PQ->front)
		{
				return true;
		}
		else
		{
				return false;
		}
}

bool out_queue(queue *PQ, int *pval,int num)
{
		if(emput_queue(PQ))//判斷隊空
		{
				return false;
		}
		else
		{
				*pval = PQ->Pbase[PQ->front];//頂端數值賦給pval
				PQ->front = (PQ->front+1)%num;//取出front(底端)資料
				return true;
		}
}
bool emput_queue(queue *PQ)
{
		if(PQ->rear == PQ->front)
		{
				printf("NO num now\n");
				return true;
		}
		else
		{
				return false;
		}
}
void traverse(queue *PQ,int num)
{
		int i = PQ->front;
		while(i != PQ->rear)//未到隊尾
		{
				printf("%d\t",PQ->Pbase[i]);
				i=(i+1)%num;
		}
		putchar('\n');
		return ;
}


總結

提示:這裡對文章進行總結:
例如:本篇主要是對靜態佇列的基本功能程式碼實現,主要是為了判斷隊空和隊滿,演算法中引入了取餘操作比較新穎,讀者可以結合書中迴圈佇列圖分析,再對照功能程式碼,邏輯理解後,對佇列的認識就會清晰許多。

相關文章