1. 程式人生 > >佇列定義及實現、迴圈佇列實現

佇列定義及實現、迴圈佇列實現

一、佇列

    佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。在佇列這種資料結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將最後被刪除的元素,因此佇列又稱為“先進先出”(FIFO—first in first out)的線性表。  

二、操作和實現

1、結構體定義

2、初始化

3、判斷是否為空

4、取得佇列的首節點值

5、入佇列操作

6、出佇列操作

7、列印佇列的內容

1、結構體定義

[cpp]
 view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #define LENGTH 100
  2. typedefchar datatype;  
  3. typedefstruct queue{  
  4.     datatype data[LENGTH];  
  5.     int front;  
  6.     int rear;  
  7. }sequence_queue;  


2、初始化

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. void init_sequence_queue(sequence_queue *sq){  
  3.     sq->front = 0;  
  4.     sq->rear = 0;  
  5. }  

3、判斷是否為空

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. bool is_empty_sequence_queue(sequence_queue *sq){  
  3.     return (sq->front == sq->rear ? true:false);  
  4. }  

4、取得佇列的首節點值

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. datatype get_head(seqence_queue *sq){  
  3.     if(sq->front == sq->rear){  
  4.         printf("the queue is empty!\n");  
  5.         exit(1);  
  6.     }  
  7.     return sq->data[sq->front];   
  8. }  

5、入佇列操作

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. void insert_sequence_queue(sequence_queue *sq,datatype data){  
  3.     if(sq->rear == LENGTH){  
  4.         printf("the queue is full\n");  
  5.         exit(1);  
  6.     }  
  7.     sq->data[sq->rear] = data;  
  8.     sq->rear++;  
  9. }  


6、出佇列操作

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. datatype delete_sequence_queue(sequence_queue *sq){  
  3.     if(sq->rear == sq->front){  
  4.         printf("the queue is empty!\n");  
  5.         exit(1);  
  6.     }     
  7.     sq->front++;  
  8.     return sq->data[sq->front-1];  
  9. }  

7、列印佇列的內容

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. void display_sequence_queue(sequence_queue *sq){  
  3.     if(sq->front == sq->rear){  
  4.         printf("the queue is empty!\n");  
  5.         exit(1);  
  6.     }     
  7.     int i ;  
  8.     for(i = sq->front;i<sq->rear;i++){  
  9.         priintf("%c ",sq->data[i]);  
  10.     }  
  11. }  

三、迴圈佇列

    由於佇列有元素出列,front就向後移動,所以佇列前面的空間就空了出來。為了更合理的利用空間,人們想了一個辦法:將佇列的首尾相連線。這樣當rear移動到LENGTH時,會再從0開始迴圈。那當什麼時候佇列滿呢?當rear等於front的時候。可是佇列為空的時候也是同樣的條件,那不就沒法判斷了嗎?又有人提出了這樣的想法:犧牲一個儲存空間,front前面不存資料,當rear在front前面的時候就是滿了,如圖:

    當rear在front之前時,佇列中剩餘一個空間,有 LENGTH - 1個元素,所以rear也為LENGTH - 1。這時就算是佇列滿了。於是

    滿的判斷條件應為:(rear+1)%LENGTH == front 。

    空的判斷條件為 rear == front。

所以一些操作有些變化: 

5、入佇列操作

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. void insert_sequence_queue(sequence_queue *sq,datatype data){  
  3.     if((sq->rear+1)%LENGTH == sq->front){  
  4.         printf("the queue is full\n");  
  5.         exit(1);  
  6.     }  
  7.     sq->data[sq->rear] = data;  
  8.     sq->rear= (sq->rear+1)%LENGTH;  
  9. }  


6、出佇列操作

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. datatype delete_sequence_queue(sequence_queue *sq){  
  3.     if(sq->rear == sq->front){  
  4.         printf("the queue is empty!\n");  
  5.         exit(1);  
  6.     }    
  7.     if(sq->front+1 == LENGTH){  
  8.         sq->front = (sq->front+1)%LENGTH;       //其實就是0     
  9.         return sq->data[LENGTH-1];  
  10.     }          
  11.     sq->front++;  
  12.     return sq->data[sq->front-1];  
  13. }  

7、列印佇列的內容

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include"queue.h"
  2. void display_sequence_queue(sequence_queue *sq){  
  3.     if(sq->front == sq->rear){  
  4.         printf("the queue is empty!\n");  
  5.         exit(1);  
  6.     }     
  7.     int i ;  
  8.     for(i=sq->front;i!=sq->rear;){  
  9.         printf("%c ",sq->data[i]);              
  10.         i=(i+1)%LENGTH;  
  11.     }  
  12. }