zoukankan      html  css  js  c++  java
  • 队列-顺序存储-简单实现

    队列最简单的表示方法是用数组. 为了实现正确判断队列空和队列满两种情况, 我们需要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("当前队列的信息如下: 
    ");
        printf("front = %d
    ", q->front);
        printf("rear = %d
    ", q->rear);
        printf("maxSize = %d
    ", q->maxSize);
    
        // 打印队列中的数据
        if (isEmpty(q)) {
            printf("当前队列中没有数据
    ");
        } else {
            printf("队列中的数据如下: 
    ");
            // 打印队列, 要根据front和rear来遍历
            for (i=q->front+1; i<=q->rear; i++) {
                printf("%d %d
    ", i, q->data[i]);
            }
        }
        printf("
    ");
    }
    
    // 判断队列是否已满
    // 是返回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("队列已满, 不能入队
    ");
            return 0;
        }
        q->rear += 1;
        q->data[q->rear] = x;
        return 1;
    }
    
    // 出队
    // 错误返回0, 正确返回被出队元素的值
    int del (link q) {
        if (isEmpty(q)) {
            printf("队列为空, 不能出队
    ");
            return 0;
        }
    
        q->front += 1;
        return q->data[q->front];
    }
    
    
  • 相关阅读:
    day 29-2 socket 文件传输、udp协议
    day 29-1 socket
    day 28-1 元类、异常处理
    day 27-1 反射、内置方法
    day 26-1 property、绑定与非绑定方法
    day 25-1 接口类、抽象类、多态
    day 24-1 继承
    day 23-1 类的命名空间、组合
    day 22
    PyMySQL操作mysql数据库(py3必学)
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7614468.html
Copyright © 2011-2022 走看看