数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列

简介: 数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列

自建算法库——顺序环形队列

本次实践将建立顺序环形队列的算法库,用于之后的工程中

实现源代码如下:

1.squeue.h

/*  
copyright (t) 2017,烟台大学计算机学院  
*All rights reserved.  
*文件名称:1.cpp  
*作者:田长航 
*完成日期:2017年12月24日  
*版本号:v1.0  
*问题描述:定义顺序环形队列存储结构,实现其基本运算,并完成测试。   
要求:   
    1、头文件sqqueue.h中定义数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:  
    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);  //出队  
  2、在sqqueue.cpp中实现这些函数   
  3、在main函数中完成测试,包括如下内容:  
    (1)初始化队列q   
    (2)依次进队列元素a,b,c   
    (3)判断队列是否为空   
    (4)出队一个元素   
    (5)输出队列中元素个数   
    (6)依次进队列元素d,e,f   
    (7)输出队列中元素个数   
    (8)将队列中所有元素删除,并输出序列   
    (9)释放队列  
*输入描述:无  
*程序输出:完成测试后的运行结果  
*/   
#include <stdio.h>    
#include <malloc.h>    
#define MaxSize 100    
typedef 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);     //出队     

2.squeue.cpp

#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;    
}    

3main.cpp

#include <stdio.h>    
#include "sqqueue.h"    
int main()    
{    
    SqQueue *q;    
    ElemType e;    
    InitQueue(q);                            //初始化队列    
    printf("该队列已初始化,");              //判断顺序环形队列是否为空    
    if(QueueEmpty(q))    
        printf("为空\n");    
    else    
        printf("不为空\n");    
    if (enQueue(q,'a')==0)                   //依次进队列元素a b c    
        printf("该队列已满,进队失败\n");    
    printf("元素a进队成功\n");    
    if (enQueue(q,'b')==0)    
        printf("该队列已满,进队失败\n");    
    printf("元素b进队成功\n");    
    if (enQueue(q,'c')==0)    
        printf("该队列已满,进队失败\n");    
    printf("元素c进队成功\n");    
    if(QueueEmpty(q))                        //判断顺序环形队列是否为空    
        printf("该队列为空\n\n");    
    else    
        printf("该队列不为空\n\n");    
    if (deQueue(q,e)==0)                     //出队一个元素    
        printf("此时队列为空,出队失败\n");    
    printf("元素%c出队成功\n",e);    
    printf("此时队列中元素个数为: %d\n\n",QueueLength(q));   //输出队列中元素个数    
    if (enQueue(q,'d')==0)                   //依次进队列元素d e f    
        printf("该队列已满,进队失败\n");    
    printf("元素d进队成功\n");    
    if (enQueue(q,'e')==0)    
        printf("该队列已满,进队失败\n");    
    printf("元素e进队成功\n");    
    if (enQueue(q,'f')==0)    
        printf("该队列已满,进队失败\n");    
    printf("元素f进队成功\n");    
    printf("此时队列中元素个数为: %d\n\n",QueueLength(q));   //输出队列中元素个数    
    printf("出队序列为:");                  //将队列中所有元素删除并输出序列    
    while(!QueueEmpty(q))    
    {    
        deQueue(q,e);    
        printf("%c ",e);    
    }    
    DestroyQueue(q);                         //释放队列    
    printf("\n该队列已销毁\n");    
    return 0;    
}    

运行结果截图如下:

image.png

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
89 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
算法 安全 数据安全/隐私保护
Crypto++库支持多种加密算法
【10月更文挑战第29天】Crypto++库支持多种加密算法
71 4
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
36 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
40 4
|
2月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
24 0
数据结构与算法学习十四:常用排序算法总结和对比
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
25 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
27 0
|
7天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
5天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。