隊列
線性結構的兩種應用:棧和堆
棧和堆表示的是分配內存的方式不同靜態 是以出棧壓棧的方式分配內存的
動態內存是以一種堆排序的方式分配內存的
靜態內存在棧中分配,動態內存在堆中分配(如double *q=(double *) malloc(200))
(q是靜態分配的,在棧裏分配的;200字節是動態分配的,是在堆裏分配的)。
在棧裏分配的是系統自動幫忙分配的,在堆裏分配的是程序員手動分配的
棧 定義:
一種可以實現“先進後出”的存儲結構(凡是滿足這一特點的就是棧存儲)
分類:
靜態棧
動態棧
算法:
壓棧
出棧
應用:
函數調用
中斷
表達式求職
內存分配
緩衝處理
迷宮
隊列 定義:一種可以實現“先進先出”的存儲結構
分類:鏈式隊列(用鏈表實現)
靜態隊列(用數組實現) 靜態隊列通常都必須是循環隊列
循環隊列的講解:
1、靜態隊列爲什麼必須是循環隊列
2、循環隊列需要幾個參數來確定
3、循環隊列各個參數的含義
(1)隊列初始化
font個rear的值都是零
(2)隊列非空
font代表的是隊列的第一個元素
rear代表的是隊列的最後一個有效的元素的下一個元素
(3)font和rear的值相等,但不一定是零
4、循環隊列入隊僞算法講解
5、循環隊列出隊僞算法講解
6、如何判斷循環你隊列是否爲空
7、如何判斷循環隊列是否已滿
預備知識:
front的值可能比rear大
front的值可能比rear小
front的值也可能與rear相等
判斷方法:
(1)、多用一個標識參數
(2)、少用一個元素空間(隊列滿的條件:(rear+1)%QueueSize==front)
8、通用的計算隊列長度公式爲:(rear-front+QueueSize)%QueueSize
入隊(r 向後移一個) 僞算法:
(1)、將值存入r所代表的位置
(2)、正確寫法:r=(r+1)%數組的長度
錯誤寫法:r=r+1
#include<stdio.h> /*以數組爲內核,實現隊列的基本功能*/
#include<malloc.h>
typedef struct Queue
{
int * pBase;
int front;
int rear;
}QUEUE;
void init(QUEUE *); //初始化
bool en_queue(QUEUE *,int val);//入隊 QUEUE * :往哪個隊列放入,val:放入的值
void traverse_queue(QUEUE *); //遍歷隊列
bool full_queue(QUEUE * pQ);
bool out_queue(QUEUE * pQ,int * pVal); //元素出隊
int main(){
QUEUE Q;
init(&Q);
int val;
en_queue(&Q,1);
en_queue(&Q,2);
en_queue(&Q,3);
en_queue(&Q,4);
en_queue(&Q,5);
en_queue(&Q,6);
traverse_queue(&Q);
if(out_queue(&Q, &val)){
printf("出隊成功,出隊的元素是:%d\n",val);
}
else{
printf(" 出隊失敗");
}
return 0;
}
void init(QUEUE *pQ){
pQ->pBase=(int *)malloc (sizeof(int )* 6); //先創建一個數組,將pBase當做數組的首地址
pQ->front=0;
pQ->rear=0;
}
bool en_queue(QUEUE * pQ,int val){
if(full_queue(pQ)==true){
return false;
}
else{
pQ->pBase[pQ->rear ]=val;
pQ->rear=(pQ->rear+1)%6; //pQ->rear在隊列中的位置
return true;
}
}
bool full_queue(QUEUE * pQ){
if(((pQ->rear)+1)%6==pQ->front){
printf(" 已滿\n");
return true;
}
else{
printf(" 未滿\n");
return false;
}
}
void traverse_queue(QUEUE * pQ){
int i=pQ->front;
while(i!=pQ->rear){
printf("%d\n",pQ->pBase[i]);
i++;
i=(i+6)%6;
}
}
bool emput_queue(QUEUE * pQ){
if(pQ->front==pQ->rear){
return false;
}
else{
return false;
}
}
bool out_queue(QUEUE * pQ,int * pVal){
if(emput_queue(pQ)){
return false;
}
else{
*pVal=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%6;
return true;
}
}