第7周项目1

来源:互联网 发布:剑网三重制版 知乎 编辑:程序博客网 时间:2024/06/04 19:52
/* *Copyright (c) 2017, 烟台大学计算机学院 *All rights reserved. *文件名称:DSitem7-1.cpp *作    者:于子淇 *完成日期:20171011*版 本 号:Code::Blocks 13.12 * *问题描述:定义顺序环形队列存储结构,实现其基本运算,并完成测试。 *输入描述:无 *程序输出:见程序运行结果演示 */

sqqueue.h

#ifndef SQQUEUE_H_INCLUDED#define SQQUEUE_H_INCLUDED#define MaxSize 5typedef char ElemType;typedef struct{    ElemType data[MaxSize];    int front,rear;     /*队首和队尾指针*/} SqQueue;void InitQueue(SqQueue *&q);  //初始化顺序环形队列void DestroyQueue(SqQueue *&q); //销毁顺序环形队列bool QueueEmpty(SqQueue *q);  //判断顺序环形队列是否为空int QueueLength(SqQueue *q);   //返回队列中元素个数,也称队列长度bool enQueue(SqQueue *&q,ElemType e);   //进队bool deQueue(SqQueue *&q,ElemType &e);  //出队#endif // SQQUEUE_H_INCLUDED

main.cpp

#include <stdio.h>#include "sqqueue.h"int main(){    ElemType e;    SqQueue *q;    printf("(1)初始化队列q\n");    InitQueue(q);    printf("(2)依次进队列元素a,b,c\n");    if (enQueue(q,'a')==0) printf("队满,不能进队\n");    if (enQueue(q,'b')==0) printf("队满,不能进队\n");    if (enQueue(q,'c')==0) printf("队满,不能进队\n");    printf("(3)队列为%s\n",(QueueEmpty(q)?"空":"非空"));    if (deQueue(q,e)==0)        printf("队空,不能出队\n");    else        printf("(4)出队一个元素%c\n",e);    printf("(5)队列q的元素个数:%d\n",QueueLength(q));    printf("(6)依次进队列元素d,e,f\n");    if (enQueue(q,'d')==0) printf("队满,不能进队\n");    if (enQueue(q,'e')==0) printf("队满,不能进队\n");    if (enQueue(q,'f')==0) printf("队满,不能进队\n");    printf("(7)队列q的元素个数:%d\n",QueueLength(q));    printf("(8)出队列序列:");    while (!QueueEmpty(q))    {        deQueue(q,e);        printf("%c ",e);    }    printf("\n");    printf("(9)释放队列\n");    DestroyQueue(q);    return 0;}

sqqueue.cpp

#include <stdio.h>#include <malloc.h>#include "sqqueue.h"void InitQueue(SqQueue *&q)  //初始化顺序环形队列{    q=(SqQueue *)malloc (sizeof(SqQueue));    q->front=q->rear=0;}void DestroyQueue(SqQueue *&q) //销毁顺序环形队列{    free(q);}bool QueueEmpty(SqQueue *q)  //判断顺序环形队列是否为空{    return(q->front==q->rear);}int QueueLength(SqQueue *q)   //返回队列中元素个数,也称队列长度{    return (q->rear-q->front+MaxSize)%MaxSize;}bool enQueue(SqQueue *&q,ElemType e)   //进队{    if ((q->rear+1)%MaxSize==q->front)  //队满上溢出        return false;    q->rear=(q->rear+1)%MaxSize;    q->data[q->rear]=e;    return true;}bool deQueue(SqQueue *&q,ElemType &e)  //出队{    if (q->front==q->rear)      //队空下溢出        return false;    q->front=(q->front+1)%MaxSize;    e=q->data[q->front];    return true;}

程序运行演示结果:
这里写图片描述
学习心得:队列在这一阶段的学习中算是一个难点了,尤其是在它引入环形队列、链队以及双端队列的概念之后,队列中的各种问题开始混淆。首先谈一下队空、队满、出队、入队这四个最核心的问题。
队空很好判断,一种情况是front与rear刚被初始化,均等于-1或是均等于0;另一种情况则是出队操作后,队列为空。两种情况的共同点是q->front==q->rear
而队满则要根据具体结构来加以判断,顺序队列中队满条件为:q->rear==MaxSize-1(该式子的最终结果即data数组的最大下标,MaxSize为最多存储的元素),而环形队列中队满的条件则是(q->rear+1)%MaxSize==q->front(在环形队列中,判断队满,尝试进队一次,若达到队头,就认为队满了,不能再进队)

%MaxSize就相当于对于环内空间的循环,假设环形队列中共有5个内存空间分别标号为0、1、2、3、4,则环形存储4个元素,当要存储第5个元素时(实际上已队满)又要循环至第0个存储位置,所以对存储空间取余,front指针永远指向当前表里首元素的前一格

了解完队空队满条件,就为后面的入队、出队的算法设计打下了基础
入队:若队非满,则入队
出队:若队非空,则出队

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 猪吃土豆中毒了怎么办 吃了不熟的土豆怎么办 吃了变绿的土豆怎么办 吃炸洋芋中毒了怎么办 脸上长毒气痘痘怎么办 吃鸡游戏中遇到毒气怎么办 吃多了颠茄片怎么办 玲珑骰子沾了水怎么办 花的枝干长歪了怎么办 电脑中毒了怎么办开不了机 台湾竹长得太高怎么办 文竹长得太高怎么办 桑叶牡l丹长虫怎么办 日本海棠开完花后枯萎了怎么办 长寿冠海棠烂根怎么办 夏季长寿冠海棠掉叶怎么办 竹节海棠有点烂根怎么办? 丽格海棠烂茎怎么办 长寿花徒长不开花怎么办 长寿花植株长了怎么办 丽格海棠不爱长怎么办 竹节海棠太高了怎么办 绿萝叶子发黄烂根怎么办 发财树叶子发黄烂根怎么办 君子兰烂根叶子发黄怎么办 四季海棠花叶子干了怎么办 海棠花叶子枯萎枝干发黑怎么办 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办