zoukankan      html  css  js  c++  java
  • 数据结构->队列->顺序循环队列ADT代码

    顺序循环队列基于数组实现时,值得注意的就是一下几点:

      1.在头尾指针移动是不是简单的++front/++rear;而是front=(front+1)%Qsize;

      2.队空:rear==front.

      3.队满:front==(rear+1)%Qsize

    //顺序循环队
    # include<stdio.h>
    # include<malloc.h>
    # include<math.h>
    # define QueueSize 11
    
    //建立一个队列结构体
    typedef struct
    {
        int front;
        int rear;
        int size;
        int data[QueueSize];
    }Queue, *qQueue;
    
    //创建一个队列
    qQueue Create()
    {
        qQueue Q = (Queue *)malloc(QueueSize * sizeof(Queue));
        Q->front = 0;
        Q->rear = 0;
        Q->size = 0;
        printf("成功建立了一个长度为%d的队列
    ", QueueSize-1);
        return Q;
    }
    
    //判断队空队满并返回队的长度
    int IsFull(qQueue Q)
    {    //判断是否队空
        if (Q->rear == Q->front)
        {
            printf("队为空
    ");
            Q->size = 0;
            return true;
        }
        else
        {    //判断是否队满
            if ((Q->rear + 1) % QueueSize == 0)
            {
                printf("队为满");
                Q->size = QueueSize;
                return false;
            }
            else
            {    //返回队中的元素个数
                //注释内容为另一种求队列长度的方法
                /*if (Q->rear - Q->front < 0)
                {
                    Q->size = Q->rear - Q->front + QueueSize;
                }
                else
                {
                    Q->size = Q->rear - Q->front;
                }*/      
                printf("队列中有%d个元素
    ", Q->size);
            }
        }
    }
    
    //入队
    qQueue InQueue(qQueue Q, int P)
    {    //判断满,若满返回错误
        if ((Q->rear + 1) % QueueSize == 0)    
            printf("队已满,请执行出队后再进行该操作!");
        else
        {    //队不满,rear=(rear+1)%n
            printf("请输入入队的元素:");
            scanf_s("%d", &P);
            Q->data[Q->rear] = P;
            printf("入队成功!入队元素为:%d
    ", Q->data[Q->rear]);
            Q->rear = (Q->rear+1)%QueueSize;
            Q->size = Q->size + 1;
            return Q;
        }
    
    }
    
    //出队
    int outQueue(qQueue Q)
    {    //判断队是否为空
        if (Q->front == Q->rear)
        {
            printf("队已空,请执行入队操作后再进行该操作");
        }
        else
        {    //队不空front+1
            int n = Q->data[Q->front];
            printf("出队成功,出队元素为:%d
    ", n);
            Q->size = Q->size - 1;
            Q->front = (Q->front + 1) % QueueSize;
            return n;
        }
    }
    
    //查看队头元素
    int frontQueue(qQueue Q)
    {
        printf("队头元素为%d", Q->data[Q->front]);
        return Q->data[Q->front];
    }
    
    //查看队尾元素
    int rearQueue(qQueue Q)
    {
        printf("队尾元素为%d", Q->data[Q->rear-1]);
        return Q->data[Q->rear];
    }
    
    //打印队列
    void printQueue(qQueue Q)
    {
        printf("队头<-:");
        int i;
        int j = Q->front;
        for (i = 0; i <= Q->size - 1; i++)
        {
            printf("  %d  ", Q->data[j%QueueSize]);
            j++;
        }
        printf(":<-队尾");
    }
    
    //主函数
    void main()
    {
        Queue q;
        qQueue Q;
        Q = &q;//Q的初始化
        int i;
        do
        {
            printf("
    ------------****------------
    ");
            printf("请输入要执行的操作序号
    ");
            printf("1.建立空队
    ");
            printf("2.入队
    ");
            printf("3.出队
    ");
            printf("4.查看队头元素
    ");
            printf("5.查看队尾元素
    ");
            printf("6.打印队
    ");
            printf("7.判断队空/满,不满返回队的长度
    ");
            printf("0.退出");
            printf("
    ------------****------------
    ");
            printf("请输入序号:");
            scanf_s("%d", &i);
            printf("
    ");
            switch (i)
            {
            case 1:Q=Create(); break;
            case 2:InQueue(Q ,i); break;//i为任意的整数,为了节省空间故用i代替
            case 3:outQueue(Q); break;
            case 4:frontQueue(Q); break;
            case 5:rearQueue(Q); break;
            case 6:printQueue(Q); break;
            case 7:IsFull(Q); break;
            case 0:printf("结束"); break;
            default:printf("输入错误!请输入0---6的整数");
    
            }
        } while (i != 0);
    }

    .

  • 相关阅读:
    tee:结果输出到文件同时也作为往后的输入信息
    hexdump:查看文件头部信息,以十六制形式查看文件
    删除大文件方法
    rename:批量更改文件名
    求从1加到100的结果
    简书里面的面试题
    开源好网站
    ubuntu 14上安装mysql离线包
    单点登录原理与简单实现---转
    Revit API 判断一个构件在某个视图中的可见性
  • 原文地址:https://www.cnblogs.com/JQbiu/p/10107591.html
Copyright © 2011-2022 走看看