資料結構(三)——佇列及實現、迴圈佇列實現
阿新 • • 發佈:2019-01-07
一、佇列
佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。在佇列這種資料結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將最後被刪除的元素,因此佇列又稱為“先進先出”(FIFO—first in first out)的線性表。
二、操作和實現
1、結構體定義
2、初始化
3、判斷是否為空
4、取得佇列的首節點值
5、入佇列操作
6、出佇列操作
7、列印佇列的內容
1、結構體定義
#define LENGTH 100 typedef char datatype; typedef struct queue{ datatype data[LENGTH]; int front; int rear; }sequence_queue;
2、初始化#include"queue.h" void init_sequence_queue(sequence_queue *sq){ sq->front = 0; sq->rear = 0; }
3、判斷是否為空
#include"queue.h" bool is_empty_sequence_queue(sequence_queue *sq){ return (sq->front == sq->rear ? true:false); }
4、取得佇列的首節點值
#include"queue.h" datatype get_head(seqence_queue *sq){ if(sq->front == sq->rear){ printf("the queue is empty!\n"); exit(1); } return sq->data[sq->front]; }
5、入佇列操作
#include"queue.h" void insert_sequence_queue(sequence_queue *sq,datatype data){ if(sq->rear == LENGTH){ printf("the queue is full\n"); exit(1); } sq->data[sq->rear] = data; sq->rear++; }
6、出佇列操作#include"queue.h" datatype delete_sequence_queue(sequence_queue *sq){ if(sq->rear == sq->front){ printf("the queue is empty!\n"); exit(1); } sq->front++; return sq->data[sq->front-1]; }
7、列印佇列的內容
#include"queue.h" void display_sequence_queue(sequence_queue *sq){ if(sq->front == sq->rear){ printf("the queue is empty!\n"); exit(1); } int i ; for(i = sq->front;i<sq->rear;i++){ priintf("%c ",sq->data[i]); } }
三、迴圈佇列
由於佇列有元素出列,front就向後移動,所以佇列前面的空間就空了出來。為了更合理的利用空間,人們想了一個辦法:將佇列的首尾相連線。這樣當rear移動到LENGTH時,會再從0開始迴圈。那當什麼時候佇列滿呢?當rear等於front的時候。可是佇列為空的時候也是同樣的條件,那不就沒法判斷了嗎?又有人提出了這樣的想法:犧牲一個儲存空間,front前面不存資料,當rear在front前面的時候就是滿了,如圖:
當rear在front之前時,佇列中剩餘一個空間,有 LENGTH - 1個元素,所以rear也為LENGTH - 1。這時就算是佇列滿了。於是
滿的判斷條件應為:(rear+1)%LENGTH == front 。
空的判斷條件為 rear == front。
所以一些操作有些變化:
5、入佇列操作
#include"queue.h" void insert_sequence_queue(sequence_queue *sq,datatype data){ if((sq->rear+1)%LENGTH == sq->front){ printf("the queue is full\n"); exit(1); } sq->data[sq->rear] = data; sq->rear= (sq->rear+1)%LENGTH; }
6、出佇列操作#include"queue.h" datatype delete_sequence_queue(sequence_queue *sq){ if(sq->rear == sq->front){ printf("the queue is empty!\n"); exit(1); } if(sq->front+1 == LENGTH){ sq->front = (sq->front+1)%LENGTH; //其實就是0 return sq->data[LENGTH-1]; } sq->front++; return sq->data[sq->front-1]; }
7、列印佇列的內容
#include"queue.h" void display_sequence_queue(sequence_queue *sq){ if(sq->front == sq->rear){ printf("the queue is empty!\n"); exit(1); } int i ; for(i=sq->front;i!=sq->rear;){ printf("%c ",sq->data[i]); i=(i+1)%LENGTH; } }