• 广大考研数据结构复习之队列


    王道书籍上队列的基本操作和课后部分习题

    一:循环队列(数组实现)

    /**
     * @author Dawn
     * @date 2019年11月12日20:39:27
     * @version 1.0
     * 循环队列:关于循环队列的最大的特点就是,在每次入队和出队以及判断队列是否满了,的时候都用的是模。而不是普通的加加减减
     */
    #include<stdio.h>
    #include<stdlib.h>
    
    #define MaxSize 6
    
    typedef int ElemType;
    typedef struct {
        ElemType data[MaxSize];//存放队列的元素
        int front, rear;//队列头和队列尾
    }SeQueue;
    
    //1.初始化
    void InitQueue(SeQueue& Q) {
        Q.rear = Q.front = 0;//标志,不是指针哦!!
    }
    //2.判断队列是否为空
    bool IsEmpty(SeQueue Q) {
        if (Q.front == Q.rear)
            return true;
        else
            return false;
    }
    //3.入队
    bool EnQueue(SeQueue& Q,ElemType x) {
        //判断是否为满了的
        if ((Q.rear + 1) % MaxSize == Q.front) {
            printf("队列到此撑了
    ");
            return false;
        }
            
    
        Q.data[Q.rear] = x;
        Q.rear = (Q.rear + 1) % MaxSize;
        return true;
    }
    //4.出队
    bool DeQueue(SeQueue& Q, ElemType& x) {
        //如果为空
        if (Q.rear == Q.front)
            return false;
    
        x = Q.data[Q.front];
        Q.front = (Q.front + 1) % MaxSize;
        return true;
    }
    int main() {
        SeQueue Q;
        InitQueue(Q);
    
        printf("队列是否为空:%s
    ", IsEmpty(Q) ? "" : "不为空");
        EnQueue(Q, 1);
        EnQueue(Q, 2);
        EnQueue(Q, 3);
        EnQueue(Q, 4);
        EnQueue(Q, 5);
        EnQueue(Q, 5);//会执行失败
        printf("队列是否为空:%s
    ", IsEmpty(Q) ? "" : "不为空");
    
        //开始出队列
        int x;
        DeQueue(Q, x);
        printf("出队元素为:%d
    ", x);//出队元素为1,先进先出
        return 0;
    }

    二:队列的链式存储

    /**
     * @author Dawn
     * @date 2019年11月11日22:25:13
     * @version 1.0
     * 队列的复习:链式存储
     */
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef int ElemType;
    
    typedef struct LinkNode {//在王道书籍上这里有个小错误。没有写LinkNode,不写会报错的
        ElemType data;
        struct LinkNode* next;
    }LinkNode;
    
    typedef struct {
        LinkNode* front, * rear;//队列的队头和队尾指针
    }LinkQueue;
    
    //1.初始化
    void InitQueue(LinkQueue& Q) {
        //带头节点哈
        Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
        Q.front->next = NULL;//初始为空
    }
    //2.判断队列是否为空
    bool IsEmpty(LinkQueue Q) {
        if (Q.front == Q.rear)
            return true;
        else
            return false;
    }
    //3.入队
    void EnQueue(LinkQueue& Q,ElemType x){
        
        LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
        p->data = x;
        //插入到队列中
        Q.rear->next = p;
        Q.rear = p;
    }
    //4.出队
    bool DeQueue(LinkQueue& Q, ElemType &x) {
        //如果队列为空
        if (Q.front == Q.rear)
            return false;
        LinkNode* p = Q.front->next;//待出队的元素
        x = p->data;
    
        Q.front->next = p->next;
        if (Q.rear == p)
            Q.rear = Q.front;//如果只有一个元素,删除后变空
        free(p);
    
        return true;
    }
    
    //王道书籍后的用2个栈(s1,s2)来实习队列
    //思路?入栈:将元素放到s1中,如果s1中满了,就必须等s2栈为“空”。再将s1中的元素“全部”放入s2中
    //        出栈:将s2中的元素取出,如果s2空了,则将s1中的“所有”元素放进s2中
    
    
    int main() {
        LinkNode L;
        LinkQueue Q;
        InitQueue(Q);
        printf("是否队列为空:%s
    ", IsEmpty(Q) ? "" : "不空");
        EnQueue(Q, 1);
        EnQueue(Q, 2);
        EnQueue(Q, 3);
        EnQueue(Q, 4);
        EnQueue(Q, 5);
        printf("是否队列为空:%s
    ", IsEmpty(Q) ? "" : "不空");
    
        ElemType x;
        DeQueue(Q, x);
        printf("出来的第一个元素为:%d
    ", x);
        DeQueue(Q, x);
        printf("出来的第二个元素为:%d
    ", x);
        return 0;
    }
  • 相关阅读:
    从底层来看Promise
    Promise初探
    时间复杂度和空间复杂度
    IDEA maven Run Maven 启动方式
    IDEA 运行maven工程报错:No goals have been specified for this build.....解决办法
    12.外键约束
    11.约束的概念及分类
    10.创建表-备注与创建表的细节说明。
    9.创建表-自增长(AUTO_INCREAMENT)
    8.创建表--主键的概念与应用
  • 原文地址:https://www.cnblogs.com/hidamowang/p/11846260.html
Copyright © 2020-2023  润新知