队列

来源:互联网 发布:linux 设置ip地址 编辑:程序博客网 时间:2024/06/05 20:29
队列的定义

队列是一种只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。只允许删除的一端叫做删除,只允许插入的一端叫做队尾。

循环队列

基本概念

顺序队列也使用一个地址连续的存储单元来依次存放当前队列中的元素,由于队头和队尾位置随入队和出队的操作而变化,因此需要设置两个指针front和rear,分别指示当前队列队头元素和队尾元素所在内存单元的位置。

存储结构

#define MAXSIZE 100;
typedef struct SeqQueue{
    Elemtype *base; //base指向队列存储区的首地址
    int front;
    int rear;
}SeqQueue;

基本操作

1.循环队列的初始化
SeqQueue InitQueue{
    SeqQueue Q;
    Q.base = (Elemtype *)malloc(MAXSIZE * sizeof(Elemtype));
    if(! Q.base){
        printf("error\n");
        exit(0);
    }
    Q.front = 0;
    Q.rear = 0;
    return Q;
}

2.判断循环队列空
int QueueEmpty(SeqQueue Q){
    return (Q.front == Q.rear) ? 1 : 0;
}

3.判断循环队列满
int QueueFull(SeqQueue Q){
    return (Q.front == (Q.rear + 1) % MAXSIZE ) ? 1 : 0;
}

4.入队操作
SeqQueue EnQueue(SeqQueue Q, Elemtype x){
    if(QueueFull){
        printf("队满");
        exit(0);
    }else{
        *(Q.base + Q.rear) = x;
        Q.rear = (Q.rear + 1) % MAXSIZE;
    }
    return Q;
}

5.出队操作
SeqQueue DeQueue(SeqQueue Q, Elemtype *e){
    if(! QueueEmpty(Q)){
        *e = *(Q.base + Q.front);
        Q.front = (Q.front + 1) % MAXSIZE;
        return Q;
    }
}

链式队列

基本概念

队列的链式存储结构,是限制仅在表尾插入,表头删除的单链表。

存储结构

typedef struct QueueNode{
    Elemtype data;
    struct QueueNode *next;
}QueueNode;
typedef struct LinkQueue{
    QueueNode *front;
    QueueNode *rear;
}

基本操作

1.链队列的初始化
LinkQueue InitQueue(){
    LinkQueue Q;
    QueueNode *p;
    p = (QueueNode *)malloc(sizeof(QueueNode));
    if(p){
        Q.front = Q.rear = p;
        Q.front->next = NULL;
        return Q;
    }else{
        printf("error\n");
        exit(0);
    }
}

2.链队列的入队操作
LinkQueue EnQueue(LinkQueue Q, Elemtype x){
    QueueNode *p;
    p = (QueueNode *)malloc(sizeof(QueueNode));
    if(!p){
        printf("error\n");
        exit(0);
    }else{
        p->data = x;
        p->next = NULL;
        Q.rear->next = p;
        Q.rear = p;
        return Q;
    }
}

3.链队列的出队操作
LinkQueue DeQueue(LinkQueue Q, Elemtype *e){
    QueueNode *p;
    if(QueueEmpty(Q)){
        printf("error\n");
        exit(0);
    }else{
        p = Q.front->next;
        *e = p->data;
        Q.front = p->next;
        if(Q.front == p){
            Q.rear = Q.front;
        }
        free(p);
    }
    return Q;
0 0
原创粉丝点击