• 数据结构04顺序队20205106009郭睿玥


    /*郭睿玥第四次算法实验作业*/
    
    
    /*实验原理
        循环队列是队列的顺序映像的实现,采用顺序存储结构存储队列,会产生假溢出现象,循环队列
    是解决假溢出的很好途径。若队列为空时队头指示器与队尾指示器同时指向某一存储单元,即此时两
    个指示器的数值相同,若队列非空,队头指示器指向队头元素下标,队尾指示器指向队尾元素的下一
    个位置的下标;
        循环队列进行入队操作时,只需直接把值赋给当前队尾指示器所指向的下标,然后队尾指示器向
    后移动一个位置即可;出队操作时若需返回队头结点值,先返回当前队头指示器所指向的下标的值,
    让队头指示器向后移动一个位置,否则直接移动位置即可;
    */
    
    /*实验环境
    CodeBlocks*/
    
    
    /*实验目的
    掌握循环队列的基本操作,循环队列初始化、入队、出队、判断队空、判断队满以及求队列长度操作;
    掌握队列在顺序存储结构上的操作实现。
    */
    
    
    
    /*实验内容
    循环队列的初始化、入队、出队、判断是否为空、求队列长度及队列输出操作的实现;
    通过设计统一界面来调用基本操作的实现。
    */
    
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #define MAXSIZE 5
    typedef int Status;// 定义函数返回值类型
    typedef int ElemType;// 定义每条数据的结构体类型
    
    typedef struct//结构体
    {
    int front;//队头指针
    int rear;//队尾指针
    ElemType* base;//base[]为数据
    }sqqueue;
    
    
    Status initsqqueue(sqqueue*q)//队列的初始化
    {
        q->base=(ElemType*)malloc(sizeof(ElemType*)*MAXSIZE);//申请空间建立数组
        if(!q->base) return 0;//空间申请是否成功
        q->front=q->rear=0;//空队列标志
        printf("初始化成功\n");
        return 1;//初始化成功返回1
    }
    
    Status queueempty(sqqueue *q)//判断是否为空
    {
       if(q->front==q->rear) //判空条件
            return 1;
        return 0;
    }
    
    Status getlength(sqqueue*q)//统计队列长度
    {
        return (q->rear-q->front+MAXSIZE)%MAXSIZE;//模运算出队列长度并返回
    }
    
    Status queueefull(sqqueue*q)//判断是否为满
    {
       if((q->rear+1)%MAXSIZE==q->front)//如果队满则头指针一定指向尾指针之后的一个结点
        return 1;
        else return 0;
    }
    
    
    Status enqueue(sqqueue*q,ElemType e)//入队操作
    {
        if(queueefull(q)) //队满则无法入队
            return 0;
        q->base[q->rear]=e;//新元素入队
        q->rear=(q->rear+1)%MAXSIZE;//尾指针移动
        return 1;
    }
    
    Status dequeue(sqqueue*q) //出队操作
    {
        ElemType e;
        e=q->base[q->front];
        q->front=(q->front+1)%MAXSIZE;//尾指针移动
        return e;//返回出队的元素
    }
    
    
    void traverse(sqqueue*l)//输出队列
    {
        sqqueue *p;/*建立一个新队列与要输出的队列一致*/
        p=l;
        for(;p->front!=p->rear;)//直到新队列成为空队列,每次输出都是新队列的头元素后使新队列出队
        {
            printf("该元素是%d,它位于队列中的第%d个单元\n",p->base[p->front],p->front+1);//输出新队列头元素
            dequeue(p);//对新队列出队
        }
        return 0;
    }
    
    int main()
    {
        int choice;
        sqqueue QQ;
    	do {/*显示操作界面*/
    		printf("1. 初始化                                                   \n");
    		printf("2. 入队;                                                   \n");
    		printf("3. 出队;                                                   \n");
    		printf("4. 求队列长度;                                             \n");
    		printf("5. 队列判空;                                               \n");
    		printf("6. 队列判满;                                               \n");
    		printf("7. 输出队列;                                               \n");
    		printf("0. 退出。                                                   \n");
    		printf("\n");
    		printf("请选择你要操作的选项:");
    		scanf("%d", &choice);//输入需要进行的选项
    		printf("\n");
    		switch (choice) {
    		case 1:{
    			initsqqueue(&QQ);//队列的初始化
    				break;
    			}
    		case 2:{//入队操作
            ElemType i;
            printf("*请输入你要入队的数据                                              *\n");
            scanf("%d",&i);
            if(enqueue(&QQ,i))
                printf("入队成功\n");
              else  printf("入队失败\n");
    				break;
    			}
    		case 3:{//出队操作
            if(queueempty(&QQ)) {
                     printf("空队,无法出队\n");//空队列无法出队
                     break;
                }
            if(dequeue(&QQ))printf("出队成功\n");//出队操作
    				break;
    			}
    		case 4:{
    		printf("该队列的长度是%d\n",getlength(&QQ));//求队列长度并输出
    				break;
    			}
    		case 5:{
    		if 	(queueempty(&QQ)) printf("空栈\n");//判空
    		    else printf("不是空栈\n");
    				break;
    			}
    		case 6:{
    		if 	(queueefull(&QQ)) printf("满栈\n");//判满
    		    else printf("不是满栈\n");
    				break;
    			}
            case 7:{
            traverse(&QQ);//输出队列
    				break;
    			}
    		case 0:{
    				printf("\n退出系统成功!请按任意键结束!\n");//退出程序
    				exit(0);
    			}
    			break;
    		}
    	} while (choice);//只要选择不为需要进行的功能不为0则该程序可以一直进行下去
        return 0;
    }
    
    /*
    实验结果
    
    操作界面如下
    
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    郭睿玥 算法与数据结构第四次作业
    
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:1
    
    初始化成功
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:2
    
    *请输入你要入队的数据                                              *
    6
    入队成功
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:2
    
    *请输入你要入队的数据                                              *
    8
    入队成功
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:2
    
    *请输入你要入队的数据                                              *
    4
    入队成功
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:2
    
    *请输入你要入队的数据                                              *
    9
    入队成功
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:2
    
    *请输入你要入队的数据                                              *
    2
    入队失败
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:3
    
    出队成功
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:4
    
    该队列的长度是3
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:5
    
    不是空栈
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:6
    
    不是满栈
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:7
    
    该元素是8,它位于队列中的第2个单元
    该元素是4,它位于队列中的第3个单元
    该元素是9,它位于队列中的第4个单元
    1. 初始化
    2. 入队;
    3. 出队;
    4. 求队列长度;
    5. 队列判空;
    6. 队列判满;
    7. 输出队列;
    0. 退出。
    
    请选择你要操作的选项:0
    
    退出系统成功!
    */
    
  • 相关阅读:
    ubuntu网络配置相关知识(转载)
    git 冲突解决(转载)
    redmine后台运行命令
    CentOS配置网卡,重启网络显示:Device does not seem to be present(转载)
    解决Xshell和vim中文乱码(转载)
    REDHAT6.2配置yum源(64位)(转载)
    Doki Doki Literature Club ZOJ
    CONTINUE...? ZOJ
    Magic Points ZOJ
    Cash Machine (POJ 1276)(多重背包——二进制优化)
  • 原文地址:https://www.cnblogs.com/ztguang/p/15731635.html
Copyright © 2020-2023  润新知