算法设计学习7
实验目的及要求:
目标是通过实验深入理解堆栈(Stack)和队列(Queue)这两种常见的数据结构,掌握它们的基本操作及应用场景,提高对数据结构的认识和应用能力。通过本实验,学生将深化对堆栈和队列等数据结构的理解,提高编程能力和问题解决能力,为进一步学习算法和数据结构打下基础。
实验设备环境:
1.微型计算机
2.DEV C++(或其他编译软件)
实验步骤:
任务一:
假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写个函数,用来判别表达式中的括号是否正确配对,并设计一个测试主函数。
[算法思想] 在算术表达式中,右括号和左括号匹配的次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特点,因此可以借助一个堆栈来进行判断。括号匹配共有以下 4 种情况:左、右括号配对次序不正确;2 右括号多于左括号;3 左括号多于右括号;左、右括号匹配正确。具体方法如下。顺序扫描算术表达式(表现为一个字符串),当遇到三种类型括号的左括号时,让该括号入栈。当扫描到某一种类型的右括号时,比较当前栈顶括号是否与之匹配,若匹配,则出栈继续进行判断;若当前栈顶括号与当前扫描的括号不匹配,则左、右括号配对次序不正确;若字符串当前为某种类型右括号而堆栈已空,则右括号多于左括号;字符串循环扫描结束时,若堆栈非空(即堆栈中尚有某种类型左括号),则说明左括号多于右括号:如果未出现上述三种情况,则说明左、右括号匹配正确。
代码如下:
#include<string.h>
#include<stdio.h>
#define MaxStackSize 100
typedef char DataType;
#include "SeqStack.h"
void ExpIsCorrect(char exp[],int n){SeqStack myStack;int i;char c;StackInitiate(&myStack);//初始化 for(i=0;i<n;i++){if((exp[i]=='(')||(exp[i]=='[')||(exp[i]=='{'))StackPush(&myStack,exp[i]);//入栈 else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='(')StackPop(&myStack,&c);//出栈 else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='('){printf("左右括号配对次序不正确!\n");return;}else if(exp[i]==']'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='[')StackPop(&myStack,&c);else if(exp[i]==']'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='['){printf("左右括号配对次序不正确!\n");return;}else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='{')StackPop(&myStack,&c);else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='{'){printf("左右括号配对次序不正确!\n");return;}else if(((exp[i]==')')||(exp[i]==']')||(exp[i]=='}'))&&!StackNotEmpty(myStack)){printf("右括号多余左括号!\n");return;}}if(StackNotEmpty(myStack))printf("左括号多于右括号!\n");elseprintf("左右括号匹配正确!\n");
}
int main(void){char a[]="(())abc[{)(]}";//定义字符串 char b[]="(()))abc{[]}";char c[]="(()()abc{[]}";char d[]="(())abc{[]}";int n1=strlen(a);//求字符串的长度 int n2=strlen(b);int n3=strlen(c);int n4=strlen(d);ExpIsCorrect(a,n1);ExpIsCorrect(b,n2);ExpIsCorrect(c,n3);ExpIsCorrect(d,n4);
}
头文件:
typedef struct{DataType stack[MaxStackSize];int top;
}SeqStack;
void StackInitiate(SeqStack*S){S->top=0;
}
int StackNotEmpty(SeqStack S){if(S.top<=0)return 0;elsereturn 1;
}
int StackPush(SeqStack*S,DataType x){if(S->top>=MaxStackSize){printf("堆栈已满无法插入!\n");return 0;}else{S->stack[S->top]=x;S->top++;return 1;}
}
int StackPop(SeqStack*S,DataType*d){if(S->top<=0){printf("堆栈已空无元素出栈!\n");return 0;}else{S->top--;*d=S->stack[S->top];return 1;}
}
int StackTop(SeqStack S,DataType*d){if(S.top<=0){printf("堆栈已空!\n");return 0;}else{*d=S.stack[S.top-1];return 1;}
}
任务二:
设有后缀表达式ABCD/-E*+,其中,变量A等于3,变量B等于6,变量C等于4,变量D等于2,变量E等于5,设计一个程序,求出该后缀表达式的值。
[算法思想] 定义了一个堆栈结构和相关的操作(初始化、入栈、出栈),然后使用堆栈来计算后缀表达式的值。在主函数中,定义了后缀表达式为"ABCD/-E*+",并调用 evaluatePostfix 函数计算表达式的值。注意,这个程序中假设变量 A 等于 3,变量 B 等于 6,变量 C 等于 4,变量 D 等于 2,变量 E 等于 5。
代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<ctype.h>
typedef int DataType;
#include "LinStack.h"
int PostExp(char str[]){DataType x,x1,x2;int i;LSNode *head;StackInitiate(&head);for(i=0;str[i]!='#';i++){if(isdigit(str[i])){x=(int)(str[i]-48);StackPush(head,x);}else{StackPop(head,&x2);StackPop(head,&x1);switch(str[i]){case'+':{x1+=x2;break;}case'-':{x1-=x2;break;}case'*':{x1*=x2;break;}case'/':{if(x2==0.0){printf("除数为0错!\n");exit(0);}else{x1/=x2;break;}}}StackPush(head,x1);}}StackPop(head,&x);return x;
}
int main(void){char str[]="3642/-5*+#";int result;result=PostExp(str);printf("后缀表达式计算结果为:%d",result);
}
头文件:
typedef struct snode{DataType data;struct snode*next;
}LSNode;
void StackInitiate(LSNode**head){*head=(LSNode*)malloc(sizeof(LSNode));(*head)->next=NULL;
}
int StackNOtEmpty(LSNode*head){if(head->next==NULL)return 0;else return 1;
}
void StackPush(LSNode*head,DataType x){LSNode*p;p=(LSNode *)malloc(sizeof(LSNode));p->data=x;p->next=head->next;head->next=p;
}
int StackPop(LSNode*head,DataType *d){LSNode*p=head->next;if(p==NULL){printf("堆栈已空出错!");return 0;}head->next=p->next;*d=p->data;free(p);return 1;
}
int StackTop(LSNode*head,DataType *d){LSNode*p=head->next;if(p==NULL){printf("堆栈已空出错!");return 0;}*d=p->data;return 1;
}
void Destroy(LSNode*head){LSNode*p,*p1;p=head;while(p!=NULL){p1=p;p=p->next;free(p1);}
}
任务三 :
链式队列设计。要求:
(1)以带头结点的循环单链表实现,并只设尾指针,不设头指针。
(2) 编写实现这种链式队列的初始化、入队列、出队列、取元素、判断非空函数。
代码如下:
(1)
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"LinListO.h"
int QueueGet(SLNode *head,SLNode*rear,DataType*d){if(rear==NULL){printf("队列已空无元素出列表!\n");return 0;}else{*d=rear->next->data;return 1;}
}
int QueueDelete(SLNode *head,SLNode*rear,DataType*d){SLNode*p;if(rear==NULL){printf("队列已空无元素出列表!\n");return 0;}else{*d=rear->next->data;p=rear->next;rear->next=p->next;free(p);return 1;}
}
int main(void){SLNode *head,*rear;DataType d;int i,x;ListInitiate(&head);for(i=0;i<10;i++){ListInsert(head,i,i+1);}rear=head;while(rear->next!=head){rear=rear->next;}QueueDelete(head,rear,&d);for(i=0;i<10;i++){QueueGet(head,rear,&d);printf("%d ",d);QueueDelete(head,rear,&d);}Destroy(&head);
}
头文件:
typedef struct Node{DataType data;struct Node *next;
}SLNode;
void ListInitiate(SLNode**head){*head=(SLNode *)malloc(sizeof(SLNode));(*head)->next=*head;
}
int ListLength(SLNode *head){SLNode *p=head;int size=0;while(p->next!=head){p=p->next;size++;}return size;
}
int ListInsert(SLNode *head,int i,DataType x){SLNode *p,*q;int j;p=head;j=-1;while(p->next!=head&&j<i-1){p=p->next;j++;}if(j!=i-1){printf("插入元素位置参数错!");return 0;}q=(SLNode *)malloc(sizeof(SLNode));q->data=x;q->next=p->next;p->next=q;return 1;
}
int ListDelete(SLNode *head,int i,DataType *x){SLNode *p,*s;int j;p=head;j=-1;while(p->next!=head&&p->next->next!=head&&j<i-1){p=p->next;j++;}if(j!=i-1){printf("删除元素位置参数错!");return 0;}s=p->next;*x=s->data;p->next=p->next->next;free(s);return 1;
}
int ListGet(SLNode *head,int i,DataType *x){SLNode *p;int j;p=head;j=-1;while(p->next!=head&&j<i){p=p->next;j++;}if(j!=i){printf("取出元素位置参数错!");return 0;}*x=p->data;return 1;
}
void Destroy(SLNode **head){SLNode *p,*p1;p=*head;while(p!=NULL){p1=p;p=p->next;free(p1);}*head=NULL;
}
(2)
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"LQueue.h"
int main(void){LQueue Q;DataType d;QuenuInitiate(&Q);if(QueueNotEmpty(&Q)){//判断是否为空 printf("队列为空. \n");}else{printf("队列非空.\n");}for(int i=0;i<9;i++){QueueAppend(&Q,i+2);}//QueueDelete(&Q,&d);for(int i=0;i<9;i++){QueueGet(Q,&d);printf("%d \n",d);QueueDelete(&Q,&d);}Destroy(&Q);
}
头文件:
typedef struct qnode{DataType data;struct qnode*next;
}LQNode;
typedef struct{LQNode*rear;
}LQueue;
void QuenuInitiate(LQueue *Q){Q->rear=NULL;}
int QueueNotEmpty(LQueue *Q){if(Q->rear==NULL)return 1;elsereturn 0;
}
void QueueAppend(LQueue*Q,DataType x){LQNode*p;p=(LQNode*)malloc(sizeof(LQNode));p->data=x;p->next=NULL;if(Q->rear==NULL){Q->rear=p;Q->rear->next=Q->rear;}else{p->next=Q->rear->next;Q->rear->next=p;Q->rear=p;}}
int QueueDelete(LQueue*Q,DataType*d){LQNode*p,*q;if(Q->rear==NULL){printf("队列已空无元素出列表!\n");return 0;}else{if(Q->rear->next==Q->rear){Q->rear=NULL; p=Q->rear;}else{*d=Q->rear->next->data;p=Q->rear->next;Q->rear->next=p->next;}free(p);return 1;}
}
int QueueGet(LQueue Q,DataType*d){LQNode*p;if(Q.rear==NULL){printf("队列已空无元素出列表!\n");return 0;}else{p=Q.rear->next;*d=p->data;return 1;}
}
void Destroy(LQueue*Q){LQNode*p,*p1;p=Q->rear->next;while(p!=NULL){p1=p;p=p->next;free(p1);}
}
相关文章:
算法设计学习7
实验目的及要求: 目标是通过实验深入理解堆栈(Stack)和队列(Queue)这两种常见的数据结构,掌握它们的基本操作及应用场景,提高对数据结构的认识和应用能力。通过本实验,学生将深化对堆…...
AF3 OpenFoldDataset类解读
AlphaFold3 data_modules 模块的 OpenFoldDataset 类是一个自定义的数据集类,继承自 torch.utils.data.Dataset。它的目的是在训练时实现 随机过滤器(stochastic filters),用于从多个不同的数据集(OpenFoldSingleDataset 或 OpenFoldSingleMultimerDataset)中进行样本选择…...
大数据(4)Hive数仓三大核心特性解剖:面向主题性、集成性、非易失性如何重塑企业数据价值?
目录 背景:企业数据治理的困境与破局一、Hive数据仓库核心特性深度解析1. 面向主题性(Subject-Oriented):从业务视角重构数据2. 集成性(Integrated):打破数据孤岛的统一视图3. 非易失…...
AI模拟了一场5亿年的进化
蛋白质是生命的基石。从驱动肌肉运动的分子引擎,到捕捉光能的光合作用机器,再到细胞内的信息处理系统,这些功能复杂的分子贯穿了生命的每一个环节。尽管科学界早已解析了蛋白质的化学结构,但蛋白质的设计逻辑于人类而言࿰…...
大模型应用初学指南
随着人工智能技术的快速发展,检索增强生成(RAG)作为一种结合检索与生成的创新技术,正在重新定义信息检索的方式,RAG 的核心原理及其在实际应用中的挑战与解决方案,通用大模型在知识局限性、幻觉问题和数据安…...
如何通过管理系统提升团队协作效率
在现代企业管理中,团队协作效率的高低直接关系到企业的竞争力和运营效率。随着信息技术的不断发展,管理系统作为提升团队协作效率的重要工具,逐渐受到企业的重视。本文将深入探讨如何通过管理系统提升团队协作效率,为企业提供实用…...
云手机如何防止设备指纹被篡改
云手机如何防止设备指纹被篡改 云手机作为虚拟化设备,其设备指纹的防篡改能力直接关系到账户安全、反欺诈和隐私保护。以下以亚矩阵云手机为例,讲解云手机防止设备指纹被篡改的核心技术及实现方式: 系统层加固:硬件级安全防护 1…...
XT1870 同步升压 DC-DC 变换器
1、 产品概述 XT1870 系列产品是一款低功耗、高效率、低纹波、工 作频率高的 PFM 控制升压 DC-DC 变换器。 XT1870 系列产品仅需要 3 个外部元器 , 即可完成低输 入的电池电压输入。 2、用途 数码相机、电子词典 LED 手电筒、 LED 灯 血压计、MP3 、遥控玩具 …...
Sentinel实战(一)、1、sentinel介绍、安装及初始化服务监控
spring cloud Alibaba -Sentinel、sentinel介绍、安装及初始化服务监控 一、Sentinel简单了解一)、Sentinel基本概念二)、Sentinel设计理念1、流量控制2、熔断降级1)、什么是熔断降级2)、熔断降级的设计理念3、系统负载保护三)、Sentinel工作机制二、Sentinel服务安装一)…...
如何重构前端项目
重构前端项目是指对现有的前端代码进行重新设计和改造,以提高代码质量、可维护性、可扩展性和性能。 重构前端项目的一般步骤: 1.评估项目: 了解项目的规模、复杂度、技术栈和现有的问题和挑战,以及重构的目标和范围。 2.制定计划: 制定一个详细的计划…...
seaweedfs分布式文件系统
seaweedfs https://github.com/seaweedfs/seaweedfs.git go mod tidy go -o bin ./… seaweed占不支持smb服务,只能用fuse的方式mount到本地文件系统 weed master 默认端口:9333,支持浏览器访问 weed volume 默认端口:8080 weed …...
Spring Boot后端开发全攻略:核心概念与实战指南
🧑 博主简介:CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师,数学与应用数学专业,10年以上多种混合语言开发经验,从事DICOM医学影像开发领域多年,熟悉DICOM协议及…...
PostgreSQL pg_repack 重新组织表并释放表空间
pg_repack pg_repack是 PostgreSQL 的一个扩展,它允许您从表和索引中删除膨胀,并可选择恢复聚集索引的物理顺序。与CLUSTER和VACUUM FULL不同,它可以在线工作,在处理过程中无需对已处理的表保持独占锁定。pg_repack 启动效率高&a…...
通过 Markdown 改进 RAG 文档处理
通过 Markdown 改进 RAG 文档处理 作者:Tableau 原文地址:https://zhuanlan.zhihu.com/p/29139791931 通过 Markdown 改进 RAG 文档处理https://mp.weixin.qq.com/s/LOBOKNA71dANXHuwxe7yxw 如何将 PDF 转换为 Markdown 以获得更好的 LLM RAG 结果 Mar…...
高速电路 PCB 设计要点一
3 高速电路 PCB 设计要点 3.1 PCB设计与信号完整性 随着电子技术的发展,电路的规模越来越大,单个器件集成的功能越来越多,速率越来越高,而器件的尺寸越来越小。由于器件尺寸的减小,器件引脚信号变化沿的速率变得越来…...
【Centos】centos7内核升级-亲测有效
相关资源 通过网盘分享的文件:脚本升级 链接: https://pan.baidu.com/s/1yrCnflT-xWhAPVQRx8_YUg?pwd52xy 提取码: 52xy –来自百度网盘超级会员v5的分享 使用教程 将脚本文件上传到服务器的一个目录 执行更新命令 yum install -y linux-firmware执行脚本即可 …...
Opencv计算机视觉编程攻略-第八节 检测兴趣点
目录 1.检测图像中的角点 2.快速检测特征 3.尺度不变特征的检测 4.多尺度FAST 特征的检测 在计算机视觉领域,兴趣点(也称关键点或特征点)应用包括目标识别、图像配准、视觉跟踪、三维重建等。这个概念的原理是,从图像中选取某…...
On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays论文阅读
On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 解决的实际问题1.3 实际意义2. 论文提出的新方法、模型与公式2.1 核心创新:标量化近似表达式关键推导步骤:公式优势:2.2 与经典方法的对比传统方…...
基于微信小程序的医院挂号预约系统设计与实现
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大…...
如何保障话费api接口的稳定性?
保障话费接口的稳定性是确保服务高效运行的关键。以下是基于最新信息的建议: 1. 选择可靠的API服务提供商 信誉和稳定性:选择有良好声誉和稳定服务记录的提供商,查看其服务水平协议(SLA)以确保高可用性。技术支持&…...
video标签播放mp4格式视频只有声音没有图像的问题
video标签播放mp4格式视频只有声音没有图像的问题 这是由于视频格式是hevc(H265)编码的,这种编码格式视频video播放有问题主要是由于以下两种原因导致的: 1、浏览器没有开启硬加速模式: 开启方法(以谷歌浏览器为例)&a…...
解决docker部署的容器第二天访问报错139的问题
前阵子我部署项目,把数据库放宿主机上,结果电脑一重启,Docker 直接把数据库删了个精光!我当时的表情 be like 😱:"我的数据呢???" 连备份都没来得及做…...
如何对接银行卡二要素核验接口?
银行卡二要素核验接口是一种通过API(应用程序编程接口)实现对用户提供的银行卡信息进行基本身份验证的技术服务,主要用于核验银行卡号与持卡人姓名是否一致,从而确认用户身份的真实性和操作合法性。 银行卡二要素核验接口通过调用…...
高效深度学习lecture01
lecture01 零样本学习(Zero-Shot Learning, ZSL): 模型可以在没有见过某种特定任务或类别的训练样本的情况下,直接完成对应的任务 利用知识迁移 模型在一个任务上训练时学到的知识,能够迁移到其他任务上比如,模型知道“狗”和“…...
用ChatGPT-5自然语言描述生成完整ERP模块
一、技术实现原理 1.1 语义理解能力 理解维度技术指标典型应用业务术语识别准确率98.7%物料需求计划流程逻辑上下文关联度0.92生产排程设计数据关系实体识别F1值0.95财务科目设置约束条件规则匹配率89%库存警戒规则 1.2 模块生成流程 五阶段生成机制: 需求澄清…...
深度学习——深入解读各种卷积的应用场景优劣势与实现细节
前言 卷积操作在深度学习领域中占据着核心地位,其在多种神经网络架构中发挥着关键作用。然而,卷积的种类繁多,每种卷积都有其独特的定义、应用场景和优势。 对于那些对深度学习中不同卷积类型(例如 2D 卷积、3D 卷积、11 卷积、转…...
python大数据相关职位,还需要学习java哪些知识
一、核心需要掌握的 Java 知识 1. Java 基础语法 语法基础:变量、数据类型、流程控制、异常处理(对比 Python 的差异)。面向对象编程(OOP):类、继承、多态、接口(Java 的 OOP 比 Pyth…...
easyPan技术回顾day4
1.主页删除接口(移动到回收站) 流程: 1.先查询要删除的文件是否存在。 2.递归获取选中的内容,以及(状态为USING)的所有子目录将其放到(delFilePidList) 3.将delFilePidList的所有子…...
Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified
Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified 一、详细描述问题描述 Traceback (most recent call last): File "app_3.py", line 22, in <module> File "flask_socketio\__init__.py"…...
chromium魔改——navigator.webdriver 检测
chromium源码官网 https://source.chromium.org/chromium/chromium/src 说下修改的chromium源码思路: 首先在修改源码过检测之前,我们要知道它是怎么检测的,找到他通过哪个JS的API来做的检测,只有知道了如何检测,我们…...
