數據結構與算法(4)--隊列

隊列

線性結構的兩種應用:棧和堆   

棧和堆表示的是分配內存的方式不同
靜態 是以出棧壓棧的方式分配內存的  
動態內存是以一種堆排序的方式分配內存的
靜態內存在棧中分配,動態內存在堆中分配(如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;
	}
}


發佈了34 篇原創文章 · 獲贊 68 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章