感謝郝斌老師吧,如果你不知道,就去找他的視頻去學習,通俗易懂!
之前刷力扣的題的時候遇到過循環鏈表,當時不知道
所以數據結構真的是編程的基礎
有緣人一定要重視
建議先學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;
}