zoukankan      html  css  js  c++  java
  • 习题3.12 另类循环队列(20 分)浙大版《数据结构(第2版)》题目集

    如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。

    函数接口定义:

    bool AddQ( Queue Q, ElementType X );
    ElementType DeleteQ( Queue Q );
    

    其中Queue结构定义如下:

    typedef int Position;
    typedef struct QNode *PtrToQNode;
    struct QNode {
        ElementType *Data;  /* 存储元素的数组   */
        Position Front;     /* 队列的头指针     */
        int Count;          /* 队列中元素个数   */
        int MaxSize;        /* 队列最大容量     */
    };
    typedef PtrToQNode Queue;
    

    注意:如果队列已满,AddQ函数必须输出“Queue Full”并且返回false;如果队列是空的,则DeleteQ函数必须输出“Queue Empty”,并且返回ERROR。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ERROR -1
    typedef int ElementType;
    typedef enum { addq, delq, end } Operation;
    typedef enum { false, true } bool;
    typedef int Position;
    typedef struct QNode *PtrToQNode;
    struct QNode {
        ElementType *Data;  /* 存储元素的数组   */
        Position Front;     /* 队列的头、尾指针 */
        int Count;          /* 队列中元素个数   */
        int MaxSize;        /* 队列最大容量     */
    };
    typedef PtrToQNode Queue; 
    
    Queue CreateQueue( int MaxSize )
    {
        Queue Q = (Queue)malloc(sizeof(struct QNode));
        Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
        Q->Front = 0;
        Q->Count = 0;
        Q->MaxSize = MaxSize;
        return Q;
    }
    
    bool AddQ( Queue Q, ElementType X );
    ElementType DeleteQ( Queue Q );
    
    Operation GetOp();  /* 裁判实现,细节不表 */
    
    int main()
    {
        ElementType X;
        Queue Q;
        int N, done = 0;
    
        scanf("%d", &N);
        Q = CreateQueue(N);
        while ( !done ) {
            switch( GetOp() ) {
            case addq: 
                scanf("%d", &X);
                AddQ(Q, X);
                break;
            case delq:
                X = DeleteQ(Q);
                if ( X!=ERROR ) printf("%d is out
    ", X);
                break;
            case end:
                while (Q->Count) printf("%d ", DeleteQ(Q));
                done = 1;
                break;
            }
        }
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例:

    4
    Del
    Add 5
    Add 4
    Add 3
    Del
    Del
    Add 2
    Add 1
    Add 0
    Add 10
    End
    

    输出样例:

    Queue Empty
    5 is out
    4 is out
    Queue Full
    3 2 1 0
    
    题目中代码没看懂,稀里糊涂写了一下,就写对了
    代码:
    bool AddQ( Queue Q, ElementType X )
    {
        if(Q->Count == Q->MaxSize)
        {
            printf("Queue Full
    ");
            return false;
        }
        Q->Data[(Q->Front + Q->Count++) % Q->MaxSize] = X;
        return true;
    }
    ElementType DeleteQ( Queue Q )
    {
        if(Q->Count == 0)
        {
            printf("Queue Empty
    ");
            return ERROR;
        }
        ElementType d = Q->Data[(Q->Front) ++];
        (Q->Count) --;
        (Q->Front) %= Q->MaxSize;
        return d;
    }
  • 相关阅读:
    使用SolrJ生成索引
    olr 性能调优 NO_NORMS
    关于 solr solrconfig.xml 的配置说明
    动态生成二维码并利用canvas合成出一张图片(类似海报、分享页)
    如何将打包好的文件做成一个APP
    vue路由对不同界面进行传参及跳转的总结
    移动端自适应布局的适配
    08年12月到1月15的工作
    继续被reject!
    虽然预料到结果,但还是感觉不爽!
  • 原文地址:https://www.cnblogs.com/8023spz/p/7636016.html
Copyright © 2011-2022 走看看