何時隊列為空?何時為滿?
由於入隊時尾指標向前追趕頭指標,出隊時頭指標向前追趕尾指標,故隊空和隊滿時頭尾指標均相等。因此,我們無法通過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...