1. 程式人生 > >【資料結構】3.5迴圈佇列(附實現程式碼)

【資料結構】3.5迴圈佇列(附實現程式碼)

迴圈佇列節約了一定的空間,仍然用陣列實現。

要注意的是

  1. rear是隊尾元素下一個單元的下標
  2. front == rear時佇列為空
  3. 人為地讓一個儲存單元不儲存任何資訊,判滿條件為 (rear+1+MAXSIZE)%MAXSIZE == front
  4. 之所以能成環全靠取餘,看下面程式碼好好理解

實現程式碼如下:

#include<stdio.h> 

#define MAXSIZE 6
#define ElemType int

typedef struct{
    ElemType data[MAXSIZE];
    int front, rear;
}SqQueue;

void
init(SqQueue &Q); bool Push(SqQueue &Q, ElemType x); bool Pop(SqQueue &Q, ElemType & x); void Traverse(SqQueue Q); int main(void) { int x; SqQueue Q; init(Q); Push(Q, 1); Push(Q, 2); Push(Q, 3); Push(Q, 4); Push(Q, 5); Push(Q, 6); Traverse(Q); if
(Pop(Q,x)) { printf("Pop succeed!\n"); printf("The data popped out is %d\n",x); } Pop(Q,x); Pop(Q,x); Pop(Q,x); Pop(Q,x); if(Pop(Q,x)) { printf("Pop succeed!\n"); printf("The data popped out is %d\n",x); } else printf
("Pop failed!\n"); return 0; } void init(SqQueue &Q) { Q.front = 0; Q.rear = 0; } bool Push(SqQueue &Q, ElemType x) { if((Q.rear + 1 + MAXSIZE) % MAXSIZE == Q.front) return false; Q.data[(Q.rear++ ) % MAXSIZE] = x; return true; }//每一次push完,rear都在最後一個儲存資料位置的後一位 bool Pop(SqQueue &Q, ElemType & x) { if(Q.front == Q.rear) return false; x = Q.data[(Q.front++ ) % MAXSIZE]; return true; } void Traverse(SqQueue Q) //從隊首開始向後遍歷 { int p = Q.front; while(p != Q.rear) printf("%d\t",Q.data[p++]); printf("\n"); }