队列的基本操作

队列即可以用链表实现也可以用顺序表实现,跟栈相反的是,栈一般用顺序表实现而队列用链表来实现,简称为链队列,我们将队头指针指向链队列的头结点,队尾指针指向终端结点(头结点不是必要的,但为了方便操作我们加上了头结点)。

一、队列的链式存储

1、链队列的存储结构

//队列的存储结构
typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
    QueuePtr front; //队头指针 
    QueuePtr rear; //队尾指针 
}LinkQueue;

 2、初始化一个队列

创建一个队列要完成两个任务,一是在内存中创建一个头结点,二是将队列的头指针和头结点指向这个生成的头结点,此时是空队列

//创建一个队列
Status InitQueue(LinkQueue &q){
    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
    if( !q->front )
        exit(0);
    q->front->next = NULL;
    return OK;
} 

3、入队操作

//入队操作
Status InsertQueue(LinkQueue &q, ElemType e){
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if( p == NULL )
        exit(0);
    p->data = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
    return OK;
}

4、出队操作

//出队操作
Status DeleteQueue(LinkQueue &q, ElemType &e){
    QueuePtr p;
    if(q->front == q->rear)
        return ERROR;
    p = q->front->next;
    e = p->data;
    q->front->next = p->next;
    if( q->rear == p )
        q->rear = q->front;
    free(p);
    return OK;
}

5、销毁一个队列

//销毁一个队列
DestroyQueue(LinkQueue &q){
    while( q->front ){
        q->rear = q->front->next;
        free(q->front);
        q->front = q->rear;
    }
    return OK;
}

二、队列的顺序存储

1、定义一个循环队列

//定义一个循环队列
#define MAXSIZE 100
typedef struct{
    ElemType *base; //用于存放内存分配基地址
    int front;
    int rear; 
}; 

2、初始化循环队列

//初始化循环队列
Status InitQueue(SqQueue &q){
    q->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
    if( !q->base )
        exit(0);
    q->front = q->rear = 0;
    return OK;
} 

3、入队操作

//入队列操作
Status InsertQueue(SqQueue &q,ElemType e){
    if( (q->rear+1)%MAXSIZE == q->front )
        return ERROR;  //队满
    q->base[q->rear] = e;
    q->rear = (q->rear+1)%MAXSIZE;
    return OK; 
}

4、出队操作

//出队操作
Status DeleteQueue(SqQueue &q,ElemType &e){
    if(q->front = q->rear)
        return ERROR;
    e = q->base[q->front];
    q->front = (q->front+1)%MAXSIZE;
    return OK;    
}

 

posted @ 2018-11-10 12:16  无心小男  阅读(2155)  评论(0编辑  收藏  举报