队列-顺序存储-简单实现

队列最简单的表示方法是用数组. 为了实现正确判断队列空和队列满两种情况, 我们需要2个指针,
front(指向第一个元素的前一个元素), rear(指向最后一个元素).
在初始情况下, front和rear都等于-1, 每入队一个元素rear都加1, 当rear=maxSize-1时,
即队列已满. 每出队一个元素, front+1

完整代码实现如下:

#include <stdio.h>
#include <stdlib.h>

struct queue {
    int* data;
    int front;
    int rear;
    int maxSize;
};
typedef struct queue node;
typedef struct queue* link;

// 函数声明
link createQueue (int maxSize);
void printQueue (link q);
int isFull (link q);
int isEmpty (link q);
int add (link q, int x);
int del (link q);

int main () {
    int i;
    int maxSize = 20;
    link qhead = createQueue(maxSize);

    // 初始队列信息
    printQueue(qhead);

    // 入队测试
    for (i=1; i<=10; i++) {
        add(qhead, i * 2);
    }
    printQueue(qhead);

    // 出队测试
    del(qhead);
    del(qhead);
    del(qhead);
    printQueue(qhead);


    return 0;
}

// 创建空队列
link createQueue (int maxSize) {
    link q;
    q = (node*)malloc(sizeof(node));
    q->data = (int*)malloc(sizeof(int) * maxSize);
    q->front = -1;
    q->rear = -1;
    q->maxSize = maxSize;
    return q;
}

// 打印
void printQueue (link q) {
    int i;
    printf("当前队列的信息如下: \n");
    printf("front = %d\n", q->front);
    printf("rear = %d\n", q->rear);
    printf("maxSize = %d\n", q->maxSize);

    // 打印队列中的数据
    if (isEmpty(q)) {
        printf("当前队列中没有数据\n");
    } else {
        printf("队列中的数据如下: \n");
        // 打印队列, 要根据front和rear来遍历
        for (i=q->front+1; i<=q->rear; i++) {
            printf("%d %d\n", i, q->data[i]);
        }
    }
    printf("\n");
}

// 判断队列是否已满
// 是返回1, 否返回0
int isFull (link q) {
    if (q->rear == q->maxSize - 1) {
        return 1;
    } else {
        return 0;
    }
}

// 判断队列是否为空
// 是返回1, 否返回0
int isEmpty (link q) {
    // 两种判断方法, 一种是front=-1为空, 也可以front=rear
    // 原理一样
    if (q->rear == q->front) {
        return 1;
    } else {
        return 0;
    }
}

// 入队
int add (link q, int x) {
    if (isFull(q)) {
        printf("队列已满, 不能入队\n");
        return 0;
    }
    q->rear += 1;
    q->data[q->rear] = x;
    return 1;
}

// 出队
// 错误返回0, 正确返回被出队元素的值
int del (link q) {
    if (isEmpty(q)) {
        printf("队列为空, 不能出队\n");
        return 0;
    }

    q->front += 1;
    return q->data[q->front];
}

posted @ 2017-09-30 11:58  阿胜4K  阅读(193)  评论(0编辑  收藏  举报