隊列的學習-C語言實現

感謝郝斌老師吧,如果你不知道,就去找他的視頻去學習,通俗易懂!
之前刷力扣的題的時候遇到過循環鏈表,當時不知道
所以數據結構真的是編程的基礎
有緣人一定要重視
建議先學C語言,然後是c語言實現數據結構
你會發現豁然開朗
不論你先學的是python還是Java
最好都去學習一下c

定義
一種可以實現“先進先出”的內存結構
分類
鏈式隊列 --用鏈表實現
靜態隊列 --用數組實現,靜態隊列通常都必須是循環隊列
循環隊列的的講解
1.靜態隊列爲什麼必須是循環隊列 **
所有和時間有關的操作都與隊列的影子
因爲傳統的數組隊列的空間只能增加,不能減少,無論是出隊還是入隊,存儲空間都增加,造成空間浪費;
2.循壞隊列需要幾個參數來確定

 需要兩個參數來確定:front/rear

3.循環隊列各個參數的含義
 兩個參數不同場合有不同的含義

建議初學者先記住,然後慢慢體會
 (1)隊列初始化:front/rear的值都是零
 (2)隊列非空:front代表的是隊列的第一個元素,rear代表的是隊列的最後一個有效元素的下一個元素。
 (3)隊列空:front/rear的值相等,但不一定是零
4.循環隊列入隊僞算法講解
 (1)將值存入rear所代表的位置
 1、將元素存入rear指向的位置;
 2、將rear的上移一位
 (2)錯誤的寫法:rear = rear + 1;正確的寫法:rear = (rear + 1)%數組的長度

5.循環隊列出隊僞算法講解-這個也叫取模操作,可實現循環的效果
兩步完成:
1、先將出隊的數值保存;
2、將f的上移一位
front = (front + 1)%數組的長度
6.如何判斷循環隊列是否爲空
如果front與rear的值相等,則該隊列就一定爲空
7.如何判斷循環隊列是否已滿
 (0)預備知識:front的值可能比rear大,front的值也可能比rear小,當然也可能兩者相等。
 (1)多增加一個標誌位參數(記錄隊列長度)
 (2)少用一個元素
用C語言僞算法表示就是:
if((r+1)/數組長度== f)//rear往後移動一位是front的判別方法,逆時針
已滿;
else
不滿;

隊列示意圖

# include <stdio.h>
# include <stdbool.h>
# include <malloc.h>
# include <stdlib.h>
//定義隊列 ,靜態的循環隊列,是通過數組的方式實現的 
typedef struct Queue

{
	int * pBase;//數組的首地址 
	int front; //隊首 參考排隊買票的方式 
	int rear;  //隊尾 

}QUEUE;

//函數的聲明 
void init(QUEUE *);//隊列的初始化 

bool en_queue(QUEUE *,int);//入列 

void traverse_queue(QUEUE *);//隊列的遍歷 

bool full_queue(QUEUE *);//隊列是否已滿 

bool out_queue(QUEUE *, int *);//出列 

bool empty_queue(QUEUE *);//隊列是否爲空

int main(void)
{
	QUEUE Q; 
	int val;
	
	init(&Q);
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);
	en_queue(&Q, 7);
	traverse_queue(&Q);
	    if(out_queue(&Q, &val) )
    {
        printf("出隊成功,出隊的元素是 :%d\n", val);
    }
    else
    {
        printf("出隊失敗!");
    }
	traverse_queue(&Q);
	
	return;
}

void init(QUEUE * pQ)
{
	pQ->pBase = (int *)malloc(sizeof(int)*6);
	pQ->front = 0;
	pQ->rear = 0;
	
	return;	
} 

bool en_queue(QUEUE * pQ, int val)//入列 改變隊尾 
{
	if( full_queue(pQ) )
	{
		printf("隊列已滿\n");
		return false;
	}
	else
	{
		pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear+1) % 6;
		return true; 
	}
}

bool out_queue(QUEUE * pQ, int * pVal)//出列  改變隊首 
{
	if( empty_queue(pQ) )
	{
		return false;
	}
	else
	{
		*pVal = pQ->pBase[pQ->front];
		pQ->front = (pQ->front +1)% 6; 
		return true;
	}
}

bool full_queue(QUEUE * pQ)//隊列是否已滿 
{
	if( ((pQ->rear +1)%6) == pQ->front )
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool empty_queue(QUEUE * pQ)
{
	if( pQ->rear == pQ->front)
	{
		return true;
	} 
	else
	{
		return false;
	}
}


void traverse_queue(QUEUE * pQ)
{
	int i = pQ->front;
	if( empty_queue(pQ) )
	{
		printf("空");
	}
	else
	{
		while(i != pQ->rear)
		{
			printf("%d ",pQ->pBase[i]);
			i = (i+1) % 6;
		}
		printf("\n");
	} 
	return;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章