您的位置:首页 > 产品设计 > UI/UE

ADT - 顺序队列(Squencial Queue)

2017-10-29 15:03 239 查看
//ADT  Squencial Queue

#define     OK                            1
#define     ERROR                     0
#define     TRUE                        1
#define     FALSE                       0
#define     OVERFLOW            -1
#define     MAXQSIZE            100
#define     INCREASEQSIZE    10

typedef int QElemType;
typedef int Status;

typedef struct {
QElemType *base;
int front;//头指针
int reer;//尾指针
int length;//队列长度
}SqQueue;

//构造一个空队列
Status InitQueue(SqQueue &Q) {
Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if(!Q.base) exit(OVERFLOW);
Q.front = Q.reer = 0;
Q.length = MAXQSIZE;
return OK;
}

//销毁队列Q
Status DestroyQueue(SqQueue &Q) {
free(Q.base);
Q.front = Q.reer = 0;
Q.length = 0;
return OK;
}

//清空队列
Status ClearQueue(SqQueue &Q) {
Q.front = Q.reer = 0;
Q.length = 0;
return OK;
}

//插入元素
Status EnQueue(SqQueue&Q, QElemType e) {
if((Q.reer+1)%Q.length == Q.front) {
Q.base = (QElemType *)realloc(Q.base, sizeof(QElemType) * (Q.length + INCREASEQSIZE));
Q.length += INCREASEQSIZE;
}
Q.base[Q.reer] = e;
Q.reer = (Q.reer + 1) % Q.length;
return OK;
}

//删除元素
Status DeQueue(SqQueue &Q,QElemType &e) {
if(Q.front == Q.reer) return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % Q.length;
return OK;
}

//判断队列是否为空
Status QueueEmpty(SqQueue Q) {
if(Q.front == Q.reer) return TRUE;
return FALSE;
}

//求队列长度
int QueueLength(SqQueue Q) {
return (Q.reer - Q.front + Q.length) % Q.length;
}

//求队头元素的值
Status GetHead(SqQueue Q, QElemType &e) {
if(Q.front == Q.reer) return ERROR;
e = Q.base[Q.front];
return OK;
}

//遍历
Status QueueTraverse(SqQueue Q) {
for(int i = Q.front; i != Q.reer; i = (i + 1) % Q.length) {
if(i == Q.front) cout << Q.base[i];
else cout << ' ' << Q.base[i];
}
cout << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  adt