迴圈佇列判斷滿與空

2021-06-18 11:02:15 字數 1980 閱讀 9608

何時隊列為空?何時為滿?

由於入隊時尾指標向前追趕頭指標,出隊時頭指標向前追趕尾指標,故隊空和隊滿時頭尾指標均相等。因此,我們無法通過front=rear

來判斷佇列「空」還是「滿」。

注:先進入的為『頭』,後進入的為『尾』。

解決此問題的方法至少有三種:

其一是另設乙個布林變數以匹別佇列的空和滿;

其二是少用乙個元素的空間,約定入隊前,測試尾指標在迴圈意義下加1

後是否等於頭指標,若相等則認為隊滿(注意:

rear

所指的單元始終為空);

其三是使用乙個計數器記錄佇列中元素的總數(實際上是佇列長度)。

第一種方法沒有實現,下面實現第二種和第三種:

一、少用乙個元素空間,約定以「佇列頭指標front在隊尾指標rear的下乙個位置上」作為佇列「滿」狀態的標誌。即:

隊空時: front=rear

隊滿時: (rear+1)%maxsize=front

front指向隊首元素,rear指向隊尾元素的下乙個元素。

[cpp]view plain

copy

print?

/// 

// author: kangquan2008@csdn///

#include 

#include 

#include 

#define queue_size 10

#define en_queue 1

#define de_queue 2

#define exit     3

typedef

intitem;  

typedef

struct

queuequeue;  

intinit_queue(queue * queue)  

queue->front = queue->tear = 0;  

return

1;  

}  int

en_queue(queue * queue, item item)  

queue->item[queue->tear] = item;  

queue->tear = (queue->tear + 1) % queue_size;  

return

1;  

}  int

de_queue(queue * queue, item * item)  

(*item) = queue->item[queue->front];  

queue->front = (queue->front + 1) % queue_size;  

return

1;  

}  int

destroy_queue(queue * queue)  

intmain()  

}  destroy_queue(&que);  

return

0;  

}  二、

#include 

#include 

#define queuesize 100

typedef

char

datatype;  

//佇列的資料元素

typedef

struct

cirqueue;  

//置空隊

void

initqueue(cirqueue *q)    

//判斷隊滿

intqueuefull(cirqueue *q)    

//判斷隊空

intqueueempty(cirqueue *q)    

//入隊

void

enqueue(cirqueue *q, datatype x)   

//出隊

datatype dequeue(cirqueue *q)    

棧與佇列 判斷棧 隊列為空 滿

陣列棧 完成int isempty stack s 函式,該函式判斷棧是否已空,如果空返回1,否則返回0。完成int isfull stack s 函式,該函式判斷棧是否已滿,如果滿返回1,否則返回0。typedef int elemtype struct stackrecord typedef s...

迴圈佇列隊滿和隊空判定

假設迴圈佇列的隊尾指標是rear,隊頭是front,其中queuesize為迴圈佇列的最大長度。1 入隊時隊尾指標前進1 rear 1 queuesize 2 出隊時隊頭指標前進1 front 1 queuesize 例1,例2 3 佇列長度 rear front queuesize queuesi...

迴圈佇列隊滿條件

隊頭指標在隊尾指標的下一位置時,隊滿。q.front q.rear 1 maxsize 因為隊頭指標可能又重新從0位置開始,而此時隊尾指標是maxsize 1,所以需要求餘。當隊頭和隊尾指標在同一位置時,隊空。q.front q.rear 1 include 2 include 3 define m...