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];
    }
    
    
  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7614468.html
Copyright © 2011-2022 走看看