【資料結構】3.5迴圈佇列(附實現程式碼)
阿新 • • 發佈:2019-01-27
迴圈佇列節約了一定的空間,仍然用陣列實現。
要注意的是
- rear是隊尾元素下一個單元的下標
- front == rear時佇列為空
- 人為地讓一個儲存單元不儲存任何資訊,判滿條件為 (rear+1+MAXSIZE)%MAXSIZE == front
- 之所以能成環全靠取餘,看下面程式碼好好理解
實現程式碼如下:
#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");
}