数据结构课程设计---括号匹配

合集下载

卡特兰数在数据结构中的应用

卡特兰数在数据结构中的应用

卡特兰数在数据结构中的应用卡特兰数是一种在组合数学中广泛应用的数列,它在数据结构中也有着重要的应用。

卡特兰数可以用来表示许多问题的解决方案数量,特别是那些涉及到组合和排列的问题。

在本文中,我们将介绍卡特兰数在数据结构中的一些常见应用。

一、括号匹配问题在许多编程语言中,括号匹配是一种常见的问题。

给定一个字符串,判断其中的括号是否匹配。

例如,对于字符串"(())",括号是匹配的;而对于字符串"(()",括号是不匹配的。

使用卡特兰数可以解决这个问题。

假设有n对括号,我们可以将问题转化为在一个n*n的网格中,从左下角走到右上角的路径数量。

其中,每一步可以向上一格或向右一格,并且不能超过对角线。

通过计算卡特兰数C(n),我们可以得到括号匹配的解决方案数量。

例如,对于2对括号,即n=2,卡特兰数C(2)=2,表示存在两种括号匹配的方式,即"(())"和"()()"。

二、二叉搜索树的种类数量在二叉搜索树(Binary Search Tree)中,左子树的节点值都小于根节点的值,右子树的节点值都大于根节点的值。

给定n个节点,求不同的二叉搜索树的种类数量。

使用卡特兰数可以解决这个问题。

假设有n个节点,我们可以选择其中一个节点作为根节点,然后将剩余的节点分成左子树和右子树。

左子树可以有0到n-1个节点,右子树则有n-1到0个节点,因此可以使用递归的方式计算左子树和右子树的种类数量。

通过计算卡特兰数C(n),我们可以得到二叉搜索树的种类数量。

例如,对于3个节点,即n=3,卡特兰数C(3)=5,表示存在5种不同的二叉搜索树。

三、凸多边形的三角剖分数量在计算几何中,凸多边形是指所有内角都小于180度的多边形。

给定一个凸多边形,求其可以进行的三角剖分数量。

使用卡特兰数可以解决这个问题。

假设有n个顶点,我们可以选择其中一个顶点作为剖分的起点,然后将剩余的顶点分成两个子多边形,分别递归计算其三角剖分数量。

数据结构 括号排序

数据结构 括号排序

2
pos = 1
1
pos = 0
( [
0
A×[ (B-C) + (D-E) ] / (F + G) × - -
2
pos = 1
1
pos = 0
( [
0
A×[ (B-C) + (D-E) ] / (F + G) × - -
2 1
pos = 0
0
pos = 1
[
A×[ (B-C) + (D-E) ] / (F + G) × - -
借助于数组顺序处理表达式 中的每个括号,遇到左括号依 次存入数组,遇到右括号,则 与数组最上部的左括号匹配, 如果发现括号匹配错误,则终 止检测过程。如果匹配成功, 则将顶部的左括号移走。继续 往下…,一直到最后一个括号
2 1 0
pos = 1
A×[ (B-C) + (D-E) ] / (F + G) × - -
2 1 0 pos = 1 pos = 0
2 1 0
[
A×[ (B-C) + (D-E) ] / (F + G) × - -
2
pos = 1
1
pos = 0
( [
0
A×[ (B-C) + (D-E) ] / (F + G) × - -
2
pos = 1
1
pos = 0
( [
0
A×[ (B-C) + (D-E) ] / (F + G) × - -
2 1
pos = 0
0
(
pos = 1
A×[ (B-C) + (D-E) ] / (F + G) × - -

数据结构括号匹配算法

数据结构括号匹配算法

括号匹配算法主要用于检查一个字符串中的括号是否匹配。

这个算法利用栈的后进先出(LIFO)性质,对输入的字符串进行检查。

以下是括号匹配算法的基本步骤:
1. 初始化一个空栈。

2. 遍历输入的字符串,对于每个字符:
* 如果字符是左括号('('、'{'、'['),将其压入栈中。

* 如果字符是右括号(')'、'}'、']'),检查栈顶的元素是否与之匹配。

如果匹配,则将栈顶元素弹出;否则,表示括号不匹配,返回错误。

3. 检查栈是否为空。

如果栈为空,表示所有括号都已匹配,返回成功;否则,表示还有未匹配的括号,返回错误。

在实现这个算法时,需要使用一个栈来存储左括号。

在遍历字符串的过程中,每遇到一个左括号,就将其压入栈中。

每遇到一个右括号,就检查栈顶的元素是否与之匹配。

如果匹配,则将栈顶元素弹出;否则,表示括号不匹配。

以上是括号匹配算法的基本思想。

具体的实现方式可能会因编程语
言和数据结构的不同而有所差异。

《数据结构》课程设计

《数据结构》课程设计

《数据结构》课程设计一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中基础的数据组织、管理和处理方法,培养其运用数据结构解决实际问题的能力。

课程目标如下:1. 知识目标:(1)理解基本数据结构的概念、原理和应用,如线性表、栈、队列、树、图等;(2)掌握常见算法的设计和分析方法,如排序、查找、递归、贪心、分治等;(3)了解数据结构在实际应用中的使用,如操作系统、数据库、编译器等。

2. 技能目标:(1)能够运用所学数据结构解决实际问题,具备良好的编程实践能力;(2)掌握算法分析方法,能够评价算法优劣,进行算法优化;(3)能够运用数据结构进行问题建模,提高问题解决效率。

3. 情感态度价值观目标:(1)激发学生对计算机科学的兴趣,培养其探索精神和创新意识;(2)培养学生团队合作意识,学会与他人共同解决问题;(3)增强学生的责任感和使命感,使其认识到数据结构在信息技术发展中的重要性。

本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。

课程注重理论与实践相结合,旨在提高学生的知识水平、技能素养和情感态度价值观。

二、教学内容《数据结构》教学内容依据课程目标进行选择和组织,确保科学性和系统性。

主要包括以下部分:1. 线性表:- 线性表的定义、特点和基本操作;- 顺序存储结构、链式存储结构及其应用;- 线性表的相关算法,如插入、删除、查找等。

2. 栈和队列:- 栈和队列的定义、特点及基本操作;- 栈和队列的存储结构及其应用;- 栈和队列相关算法,如进制转换、括号匹配等。

3. 树和二叉树:- 树的定义、基本术语和性质;- 二叉树的定义、性质、存储结构及遍历算法;- 线索二叉树、哈夫曼树及其应用。

4. 图:- 图的定义、基本术语和存储结构;- 图的遍历算法,如深度优先搜索、广度优先搜索;- 最短路径、最小生成树等算法。

5. 排序和查找:- 常见排序算法,如冒泡、选择、插入、快速等;- 常见查找算法,如顺序、二分、哈希等。

《数据结构课程设计》指导书

《数据结构课程设计》指导书

《数据结构》课程设计指导书沈阳理工大学.信息学院2013.11.1一.目的与意义软件设计能力对计算机专业的学生是很重要。

通过数据结构的学习,使学生对软件编程能力有一定的提高。

数据结构课程设计是锻炼学生在进一步掌握模块化、结构化程序设计的方法的同时,培养学生运用已学知识分析问题、解决问题及编写实用程序的能力,通过对线性化、层次化、网络化数据结构的了解进一步掌握自然数据的结构方式及组织方式,让学生深入体会存储在计算机中的数据及程序中如何运用数据实现编程。

主要目的如下:1.通过本课程设计使学生对面向对象的设计过程有初的认识,并对面向对象的高能语言的学习打下基础,2.通过不同类型的程序设计使学生进一步掌握数据的几种不同的组织和存储方式,为高级编程做准备,3.为专业课的深入学习和毕业设计打基础二.任务和要求分析每一组题目,按要求完成相应的题目:1.题目参照附录中《数据结构课程设计》题目选题。

2. 要求:1)对相应的题目进行算法设计2)编写源代码3)上机调试4)显示调试结果5)写出实验总结3.课程设计说明书设计完成后,将自己选定的题目按上述要求完成课程设计说明书。

课程设计说明书内容包含:题目、要求、初步设计(可以是流程图、功能模块图)、详细设计、程序代码、测试数据、运行结果、遇到的问题及总结几部分。

三.进度安排设计总学时为2周第一周:查阅资料、小组讨论、进行模块划分写出分析报告,画N-S结构化框图,编写程序清单,上机调试.第二周周四、五:验收(计算机机房),并将课程设计报告交上来.四.考核标准与成绩评定方式成绩评定有如下几项参考:1.初步设计内容的考核:是否有查阅资料能力?是否有设计思想?2.程序编码能力调试能力的考核:程序是否清晰、易读?在技算计上是否可独立完成程序的调试,是否熟练?3.说明书质量的考核:设计结构是否合理?叙述是否正确?方案是否可行?4.答辩:设计结果的调试能力,对自己设计是否熟练?5.出勤率极平时表现的考核:出勤超过2次不到者成绩为不及格。

数据结构实验题目

数据结构实验题目

实验题目一一、单链表基本运算【问题描述】设计并实现线性表的单链表存储和运算。

【基本要求】实现单链表的插入、删除和遍历运算,每种操作用一个函数实现。

插入操作:将一个新元素插入表中指定序号的位置。

删除操作:将指定序号的元素从表中删除。

遍历操作:从表头按次序输入所有元素的值,若是空表,则输出信息“empty list!”。

【实现提示】程序运行时,首先在main函数中创建空的、带头结点的单链表。

然后多次调用实现插入操作的函数(每次都将元素在序号1位置上插入),将元素依次插入表中,最后调用实现遍历操作的函数输出所有元素。

之后再多次调用实现删除操作的函数将表还原为空表(每次都删除第1个元素,每删除一个元素后,将表中剩余元素都输出一次)。

【测试数据】输入数据:1 2 3 4 5 0(为0时结束,0不存入链表)第一次输出:5 4 3 2 1第二次输出:4 3 2 1第三次输出:3 2 1第四次输出:2 1第五次输出:1第六次输出:empty list!二、约瑟夫环问题【问题描述】编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。

报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。

【基本要求】利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。

【测试数据】M的初始值为20;n等于7,7个人的密码依次为:3,1,7,2,4,8,4。

输出为:6,1,4,7,2,3,5【实现提示】程序运行时,首先要求用户指定初始报数上限值,然后读取各人的密码。

可设n≤30。

此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。

【选作内容】用顺序存储结构实现该题目。

三、一元多项式相加、减运算器【问题描述】设计一个一元稀疏多项式简单计算器。

《数据结构》学习指导

《数据结构》学习指导

《数据结构》学习指导说明:本指导以《数据结构》(C语言版)(严蔚敏等编著,清华大学出版社1997年出版,国家级优秀教材特等奖)和《数据结构题集》(严蔚敏等编著,清华大学出版社1999年出版)为教学主要参考书。

一、绪论1、学习目的:明确数据结构课程在本专业知识结构中的地位,作用。

课程的特点,教学的要求,方法。

明确数据结构所研究的问题以及有关基本概念。

初步掌握抽象数据类型的表示与实现,初步明确算法分析的作用与分析的重点,初步掌握算法分析的方法。

2、学习重点:数据的逻辑结构、存储结构及其算法,数据结构的有关概念,抽象数据类型及其表示与实现,算法,算法设计的要求,算法的时间复杂度和算法的空间复杂度。

3、学习难点:数据结构的有关概念,抽象数据类型的表示与实现;算法的时间复杂度分析。

4、课程内容与基本要求(一) 数据结构的引入(1) 三个世界:现实世界,信息世界,机器世界。

数据结构要解决的就是实现从现实世界到信息世界,再由信息世界到机器世界的转换,从而实现用计算机来解决问题的目的。

(2) 非数值问题(结合三个世界讲):控制,管理,数据处理(3) 数值问题:数值计算(4)数据结构:从学科角度讲,数据结构是一门研究非数值计算的程序设计问题中计算机操作对象以及他们之间的关系和操作等等的学科。

(二) 课程的地位,性质,作用。

(1) 地位: 计算机专业的核心课程之一。

(2) 性质: 算法理论基础和软件设计的技术基础课。

(3) 作用: 程序设计的基础,编译程序,操作系统,数据库系统及软件系统和应用程序的基础(三) 数据结构的产生和发展(四) 课程的特点,学习的要求教材:《数据结构》(C语言版)严蔚敏等编著北京清华大学出版社1997年参考书:《数据结构》许卓群等编著北京高等教育出版社1987年数据结构实用教程》(C/C++描述)徐孝凯北京清华大学出版社1999年《数据结构题集》严蔚敏等编著北京清华大学出版社1999年《数据结构导学》苏光奎等编著北京清华大学出版社20XX年《数据结构》(C语言篇)-习题与解析李春葆编著北京清华大学出版社20XX年《数据结构》实验指导书唐开山自编讲义20XX年(五) 基本概念和术语数据数据元素数据对象(4)数据结构:按某种逻辑关系组织起来的一批数据,按一定的存储表示方式把它存储到计算机的存储器中,并在这些数据上定义了一个运算的集合,叫做一个数据结构。

C语言实验二、括号匹配

C语言实验二、括号匹配

实验二、括号匹配一、问题描述假设一个输入字符串中包含圆括号、方括号和花括号三种类型的括号,以及其它一些任意字符。

编写程序,判别串中的括号是否正确匹配,即必须满足以下条件1.各种左、右括号的个数要一致;2.要符合正确的嵌套规则。

基本方法:在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最后进入的左括号消解,或者是不合法的情况;若是左括号,则压入栈中,同时在算法的开始和结束时,栈都应该为空,否则不合法。

二、基本要求输入一个算术表达式,利用栈存储结构来存入左括号,然后判断表达式中的括号是否匹配。

三、测试数据(1)([3+2]+(7*9))(2)[([3/2 ]-[5*6])](3)[7+8-(8-9])(4)(2+](3*9)))四、实现提示1、算法思路(1)对于栈的操作包括初始化initstack、判断栈是否满sfull、判断栈是否空sempty、入栈push和出栈pop操作。

该函数被主函数调用。

(2)在主函数中输入一个算术表达式,依次取出该算术表达式的某个字符,如果是左括号则入栈,如果是右括号则出栈,并判断右括号与出栈的元素是否匹配。

当算术表达式取完后,再判断栈是否为空,如果不空,则说明括号不匹配。

2、数据结构typedef struct stk//定义的栈结构{char *s; //栈中存放元素int top;//栈顶指针}stack;3、基本操作void initstack(stack *st) /* 栈s1和s2的初始化操作,st为指向s1或s2的指针 */int sfull(stack st) /* 判断栈s1和s2是否满的操作 */int sempty(stack st) /* 判断栈s1和s2是否空的操作 */int push(stack st,char e) /* 入栈操作,e为栈中结点类型 */int pop(stack *st,char *e) /*出栈操作,e为指向栈中结点的指针类型 */5、主程序main(){int i=0;char e;stack s1;//存放左括号的栈char str[100];//存放算术表达式的值initstack(&s1);printf("请输入表达式\n");gets(str);//输入算术表达式while(i<strlen(str)){if (str[i]=='('||str[i]=='['||str[i]=='{'){……}else if (str[i]==')'||str[i]==']'||str[i]=='}'){……else i++;}……}5、输出结果测试数据(1)([3+2]+(7*9))括号匹配(2)[([3/2 ]-[5*6])]括号匹配(3)[7+8-(8-9])第10个元素左右括号不匹配(4)(2+](3*9)))第4个元素左右括号不匹配。

数据结构课程设计报告课案

数据结构课程设计报告课案

广西科技大学鹿山学院课程设计2015-2016 学年第2 学期课程名称:数据结构课程设计设计名称:数据结构课程设计系别:电气与计算机工程系专业班级:计软141班姓名:邓康言学号:20141409指导教师:俸学文评阅成绩:评阅人:二〇一六年三月三十日电气与计算机工程系实践教学管理中心目录一、任务书 (2)2.1.存储结构与基本运算的算法 (2)2.3.学生管理系统 (2)2.6.数据库管理系统 (3)3.2括号的匹配 (8)3.5马踏棋盘 (9)4.2 看病排队候诊问题 (10)4.4 停车场管理 (11)5.2 KMP算法 (13)5.4 大型整数计算 (13)7.2 线索二叉树的创建及遍历 (14)7.4电文的编码的译码 (15)7.5家族关系查询系统 (16)二、课程设计总结 (18)三、参考文献 (18)一、任务书2.1.存储结构与基本运算的算法任务:用C语言描述顺序表和线性表2.3.学生管理系统任务:要求以学生成绩管理业务为背景,设计一个“学生管理系统”。

主要对学生资料的录入、浏览、插入、和删除等基本功能的实现算法思路:管理学生的成绩适合用单链表,方便插入和删除学生记录实现动态管理。

(1)定义单链表的结构体模块(2)单链表的建立模块(3)单链表的结点插入模块(4)单链表的结点删除模块(5)单链表的结点数据输出模块(6)主函数模块运行结果:算法心得:本程序为每一个处理功能都写了相应的函数模块。

从而使得学生管理系统具有实用性。

2.6.数据库管理系统任务:设计一个数据库管理系统,用户可以自行定义和创建数据库,能够对数据库实现插入、浏览、浏览定位、条件定位、按条件修改、按条件排序、删除和全部删除等功能实现。

并能保存数据库信息到指定文件以及打开并使用已存在的数据库文件,但数据库结构定义后不允许修改。

算法思路:由于数据库是通用的,因此先定义一个通用数据库。

用户这个库结构上可以应用所需的多个字段类型,创建自己的数据库。

数据结构括号匹配实验报告

数据结构括号匹配实验报告

括号的匹配1. 需求和规格说明(1)实现括号的是否匹配的判定。

(2)实现匹配错误的提示。

(3)实现栈内容的动态显示。

2.设计2.1.设计思想(1)对于括号匹配的判定,首先输入字符串到缓冲区。

逐个字符读取字串,遇到的是左括号则入栈,若是右括号,则出栈。

出栈的左括号如果和右括号匹配,则一对括号匹配成功;否则,这对括号匹配失败,并给出错误提示。

(2)分析括号匹配错误出现的情况,主要有三种:左括号数大于右括号数,左括号与右括号不匹配,右括号数大于左括号数。

根据栈的存储情况就能判定出这三种情况,并且实时的将信息放映到可视化控件上。

(3)对于匹配过程和栈内容的动态显示,可以用listbox 控件实时的显示和更新。

窗口上有两个listbox 控件,第一个动态显示push 和pop 动作以及提示错误信息;第二个listbox 则动态模拟栈内的存储情况。

2.2.设计表示(1)存储结构Node 节点template <class element>class Node{public:element ele;Node *pre; // 前驱指针Node *next; //后继指针Node(){pre=NULL; next=NULL;}Node(element e){ele=e;pre=NULL;next=NULL;}Node * MakeNode(element e)//传入参数返回一个节点指实现参数的封装针,{Node<element> *temp=new Node(e); return temp;}};MyListStack 链栈template <class element> class MyListStack{public:Node<element> *base;Node<element> *top;int index;MyListStack() //初始化链表{base=new Node<element>(); top=base;index=0;}void push(element n) //push{Node<element> *temp=new Node<element>(n); top->next=temp;temp->pre=top;top=temp; index++;}void pop(element & out) //pop{ out=top->ele; top=top->pre; delete top->next; top->next=NULL; index--;}BOOL isEmpty(); //返回栈是否为空{if(index) return FALSE;else return TRUE;}virtual ~MyListStack() //析构链栈,释放空间{Node<element> *p=base; Node<element> *q=p->next;while(p->next!=NULL){ delete p; p=q; q=p->next;} delete p;}};(2)涉及的操作void CKuohaopipeiDlg::OnButtonClear() // 清空窗口控件。

(数据结构)括号匹配的检验(源代码)

(数据结构)括号匹配的检验(源代码)

数据结构括号匹配问题#include<stdio.h>#include<stdlib.h>#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define INEEASLIBE -1#define OVERFLOW -2typedef int status;typedef char elemtype;typedef struct{elemtype *data;int length;elemtype *top;}list;status creat(list &L){L.data=(elemtype*)malloc(2*sizeof(elemtype));if(!L.data){return ERROR;}L.top=L.data;L.length=1;return OK;}status push(list &L,elemtype e){elemtype *dat;dat=(elemtype*)realloc(L.data,(L.length+1)*sizeof(elemtype));if(!dat){return ERROR;}L.data=dat;L.length++;*(L.top)=e;L.top++;return OK;}status pop(list &L,elemtype &e){if(L.top==L.data){printf("\n已是堆低无数据元素\n");return ERROR;}L.top--;e=*(L.top);return OK;}main(){list L;creat(L);char a[20],b;int i=0,m=0;while(i<20){printf("请输入括号序列:('#'表示输入结束)\n");scanf("%c",&a[i]);getchar();if(a[i]=='#'){break;}if(a[i]=='('||a[i]==')'||a[i]=='['||a[i]==']'||a[i]=='{'||a[i]=='}'||a[i]== '<'||a[i]=='>'){i++;}else{printf("输入的不是括号字符\n请重新输入\n");}}m=i;i=0;while(i<m){if(a[i]==']'||a[i]==')'||a[i]=='}'){if(L.top==L.data){printf("括号匹配出错\n");exit(0);}else{pop(L,b);if((a[i]-b)!=2&&(a[i]-b)!=1){printf("括号匹配出错\n");exit(0);}}}elsepush(L,a[i]);i++;}if(L.data!=L.top)printf("括号匹配出错\n");elseprintf("\n\n括号匹配成功\n");}THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考。

括号匹配实验报告

括号匹配实验报告

括号匹配实验报告实验报告课程名称:数据结构班级:实验成绩:实验名称:栈、队列、字符串和数组学号:批阅教师签字:实验编号:实验⼆姓名:实验⽇期:指导教师:组号:实验时间:⼀、实验⽬的(1)掌握栈、队列、串和数组的抽象数据类型的特征。

(2)掌握栈、队列、串和数组的抽象数据类型在计算机中的实现⽅法。

(3)学会使⽤栈、队列来解决⼀些实际的应⽤问题。

⼆、实验内容与实验步骤(1)实验内容:假设表达式中除了变量名、常量和运算符外,还可以允许两种括号:圆括号和中括号,其嵌套的次序随意,编写程序检验输⼊的表达式中括号的的顺序是否合法。

(2)描述抽象数据类型或设计的函数描述,说明为什么要使⽤这种抽象数据类型,并说明解决设想。

抽象数据类型或函数描述:⾸先定义了⼀个结构体并且声明为栈类型,在其中定义了空间基地址的指针、栈顶指针以及栈存储空间的⼤⼩。

之后设计了Creat _Stack的函数,⽤此函数来创建⼀个空栈,这样可以使⽤堆栈来实现括号匹配的功能,⼜设计了⼀个名为Stack_Full的函数了来判断栈是否已满,若栈未满才可继续之后的压栈功能,如果堆栈已满,则需要使⽤realloc来动态分配空间,扩⼤栈的存储空间。

我还设计了⼀个名为empty的函数,⽤它来判断堆栈是否为空,堆栈为空或不为空时分别返回0或1。

之后设计了名为push和pop的函数来实现括号的⼊栈和出栈,之后设计了名为Match的函数,来判断括号是否匹配,设计了名为clean的函数来清空堆栈,这样可以连续判断不同的多项式的括号是否匹配。

解决设想:对于本题,⾸先我使⽤了栈结构,利⽤栈中数据“先进后出”的特点来实现对括号是否匹配的检验。

实现过程基本如下:从左到右依次扫描多项式,如果遇到左括号便将左括号⼊栈,在所有左括号⼊栈之后便可以扫描到右括号,如果扫描到的右括号和栈顶的左括号可以匹配时,将左括号出栈,以此类推,最后判断栈是否为空,若为空,则括号匹配,否则括号不匹配。

括号匹配检测实验报告(3篇)

括号匹配检测实验报告(3篇)

第1篇实验名称:括号匹配检测实验目的:1. 理解括号匹配的基本原理。

2. 掌握使用栈进行括号匹配检测的方法。

3. 通过编程实现括号匹配检测功能。

实验时间:2023年X月X日实验地点:实验室实验器材:1. 计算机2. 编程软件(如Python、Java等)3. 文档编辑器实验内容:一、实验原理括号匹配检测是计算机科学中的一个基础问题,它涉及到字符串中括号的正确配对。

常见的括号包括圆括号()、方括号[]和花括号{}。

一个有效的括号序列是指,序列中的每个左括号都有一个对应的右括号,并且括号内的内容可以嵌套。

括号匹配检测通常使用栈(Stack)这一数据结构来实现。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,适用于括号匹配检测的原因是括号的匹配顺序与它们出现的顺序相反。

二、实验步骤1. 设计算法:确定使用栈进行括号匹配检测的算法步骤。

2. 编写代码:根据算法步骤,编写实现括号匹配检测功能的代码。

3. 测试代码:使用不同的测试用例对代码进行测试,确保其正确性。

4. 分析结果:对测试结果进行分析,评估代码的性能和正确性。

三、实验代码以下是一个使用Python实现的括号匹配检测的示例代码:```pythondef is_balanced(s):stack = []bracket_map = {')': '(', ']': '[', '}': '{'}for char in s:if char in bracket_map.values():stack.append(char)elif char in bracket_map.keys():if not stack or bracket_map[char] != stack.pop(): return Falsereturn not stack测试用例test_cases = ["((()))", True"([{}])", True"({[}])", False"((())", False"()[]{}", True"([)]", False"(({[]}))", True"" True]for case in test_cases:print(f"Input: {case}, Output: {is_balanced(case)}")```四、实验结果与分析通过上述代码,我们对一系列测试用例进行了括号匹配检测。

判断括号是否匹配的算法

判断括号是否匹配的算法

判断括号是否匹配的算法《判断括号是否匹配的算法:一场有趣的探索之旅》嗨,小伙伴们!今天我要和大家分享一个超级有趣的东西,那就是判断括号是否匹配的算法。

你可能会想,括号有啥特别的呀?嘿,这你就不懂了吧,这里面可大有学问呢!我先给你讲讲啥是括号匹配。

就好比我们玩搭积木,不同形状的积木要按照一定的规则才能搭得稳。

括号也是这样,有小括号“()”、中括号“[]”、大括号“{}”。

它们就像小伙伴一样,要成对出现,而且是按照一定的顺序哦。

比如说,小括号里面可以套小括号,就像小盒子可以放在大盒子里面一样。

中括号和大括号也是类似的道理。

我有个同学叫小明,他就老是在这个括号匹配上犯迷糊。

有一次,我们在做数学题,里面有好多括号的式子,像这个“[(2 + 3) * 4 - {5 + (6 - 1)}]”。

小明看了半天,挠挠头说:“哎呀,这括号看得我眼花缭乱的,怎么知道它们是不是匹配的呀?”我就跟他说:“这不难,就像走迷宫一样,我们得有个方法。

”那这个方法是啥呢?有一种很简单的算法,我们可以把它想象成一场排队游戏。

我们把左括号当成小朋友进队伍,右括号当成小朋友出队伍。

比如说,遇到一个小括号“(”,就好比一个小朋友走进了队伍,然后遇到一个对应的“)”,就像这个小朋友又走出了队伍。

如果在这个过程中,有小朋友进了队伍但是找不到对应的出去的路,或者还没进队伍就有人想出去了,那这个括号肯定就是不匹配的。

我和小明开始一起用这个方法来做那道数学题。

我们从最左边开始看,先看到“[”,就像一个小队长站在那里,标记一下,然后看到“(”,又有一个小朋友进队伍了。

接着计算里面的式子,又看到“{”,这就像又来了一个小队长带着他的队员。

我们就这么一步一步地看,就像在迷宫里找路一样。

每遇到一个左括号,就想象有人进队伍,每遇到一个右括号,就想象有人出队伍。

这时候,我的另一个好朋友小红也凑了过来。

她看我们在研究括号匹配,就说:“这看起来好复杂啊,有没有更简单的办法呀?”我就跟她说:“其实还有一种用栈来解决的方法呢。

括号匹配问题

括号匹配问题

东华理工大学长江学院课程设计报告数据结构课题设计报告设计题目:括号匹配问题姓名:班级:学号:指导老师:二0一0年五月目录1.设计内容 (1)问题描述 (1)问题分析 (1)2.概要设计 (2)2-1模块一:初始化一个堆栈 (2)2-2模块二:进栈 (2)2-3模块三:测试堆栈是否为空 (2)2-4模块四:退栈 (2)2-5模块五:各模块间的调用关系 (2)3.算法描述 (3)3-1程序流程图: (3)3-2程序代码: (4)4.算法分析 (6)5.心得体会 (8)6.参考资料 (8)1.设计内容问题描述假设一个算术表达式中可包含三种括号:圆括号,方括号和花括号且这三种括号可按任意次序嵌套使用。

试利用栈的运算,编写判别给定表达式中所含括号是否正确配对出现的算法。

问题分析此程序须要完成如下要求:表达式中有三种括号:圆括号、方括号和花括号,嵌套顺序任意。

实现本程序需要解决:①用什么数据结构;②怎样实现判断括号是否匹配;③括号匹配与否有几种情况;④输出与输入数据的形式。

本程序的难点在于怎么判断括号是否匹配。

2.概要设计2-1模块一:初始化一个堆栈堆栈的顺序存储结构可以利用一个具有M个元素的数组STACK[0..M-1]来描述。

其中,STACK作为堆栈的名字,且不妨设:#define M 100 */定义堆栈的最大容量,并初始化栈顶指针变量top=-1。

2-2模块二:进栈在容量为M的堆栈中插入一个新的元素E[i],栈顶元素的位置由top指出。

新的数据元素进栈,将栈顶指针加1,然后将新的数据元素E[i]插入到修改以后的top指出的新的栈顶位置上。

2-3模块三:测试堆栈是否为空测试堆栈是的栈顶指针top是否为-1。

2-4模块四:退栈从堆栈中退出当前栈顶元素,并保存在变量item中,同时将栈顶指针减1修改栈顶指针位置。

2-5模块五:各模块间的调用关系首先创建一个堆栈并初始化,依次读入字符直到文件的末尾。

如果读得的字符为左括号,则将其压入堆栈。

数据结构代码题

数据结构代码题

数据结构代码题数据结构是计算机中用于组织和存储数据的一种方式。

在实际的软件开发中,我们经常需要使用各种数据结构来解决不同的问题。

这篇文章将介绍数据结构的一些常见代码题,并提供相应的参考内容。

1. 数组反转题目:给定一个数组,要求将数组中的元素反转,并返回反转后的数组。

解题思路:- 使用两个指针,一个指向数组的开头,一个指向数组的末尾。

- 不断交换指针指向的元素,直到两个指针相遇。

- 返回反转后的数组。

参考代码:```pythondef reverse_array(arr):left = 0right = len(arr) - 1while left < right:arr[left], arr[right] = arr[right], arr[left]left += 1right -= 1return arr```2. 链表反转题目:给定一个链表,要求将链表反转,并返回反转后的链表。

解题思路:- 使用三个指针,分别指向当前节点、前一个节点和后一个节点。

- 不断改变指针指向,直到当前节点为空。

- 返回反转后的链表的头节点。

参考代码:```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef reverse_linked_list(head):prev = Nonecurr = headwhile curr:next_node = curr.nextcurr.next = prevprev = currcurr = next_nodereturn prev```3. 栈的应用——括号匹配题目:给定一个只包含括号字符的字符串,判断括号是否匹配。

解题思路:- 遍历字符串的每个字符。

- 如果遇到左括号,则将其入栈。

- 如果遇到右括号,则判断栈顶的括号是否与之匹配。

- 如果匹配,则继续遍历;- 如果不匹配,则返回 False。

数据结构课程设计报告含菜单

数据结构课程设计报告含菜单

算法和数据结构课程设计报告系(院):计算机科学学院专业班级:计科11005 姓名:张林峰学号: 201003784 指导教师:詹泽梅设计时间:2012.6.11 - 2012.6.18设计地点:12教机房目录一、课程设计目的 (2)二、设计任务及要求 (2)三、需求分析 (2)四、总体设计 ................. 错误!未定义书签。

五、详细设计和实现[含代码和实现界面].. 8六、课程设计小结 (15)一.设计目的1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

2.提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。

4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。

二.设计任务及要求根据《算法和数据结构》课程的结构体系,设计一个基于DOS菜单的应用程序。

要利用多级菜单实现各种功能。

比如,主界面是大项,主要是学过的各章的名字诸如线性表、栈和队列、串和数组及广义表等,子菜单这些章中的节或者子节。

要求所有子菜单退出到他的父菜单。

编程实现时,要用到C++的面向对象的功能。

三.需求分析菜单运用极其广泛,应用于各行各业。

菜单运用起来极其方便。

随着社会的发展,社会的行业出现多样化,也就需要各式各样的菜单。

这就需要设计人员十分精细的设计。

进一步了解《算法和数据结构》课程的知识结构体系,绘制整个课程的知识结构逻辑示意图,类似于:根据算法和数据及结构的课程安排,可以设计如上所示的菜单。

在主菜单里可以有“线性表”、“栈和队列”、“串、数组、广义表”、“树”、“图”、“查找”、“排序”。

括号匹配检验

括号匹配检验

括号匹配检验利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。

输入一个包含上述括号的表达式,检验括号是否配对。

Input第一行:输入一个包含圆括号或方括号、不超过80个字符的表达式串。

Output第一行:若输入表达式括号匹配,输出"matching"; 若不匹配,输出具体信息:"isn't matched pairs", 或"lack of left parenthesis"或"lack of right parenthesis"typedef char SElemType;#include"malloc.h"#include"stdio.h"#include"math.h"#include"process.h" // exit()#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等#define STACK_INIT_SIZE 10 // 存储空间初始分配量#define STACKINCREMENT 2 // 存储空间分配增量struct SqStack{SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针int stacksize; // 当前已分配的存储空间,以元素为单位}; // 顺序栈Status InitStack(SqStack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));S.top=S.base;if(!S.base) return ERROR;S.stacksize=STACK_INIT_SIZE;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top) return TRUE;else return FALSE;}Status Push(SqStack &S,SElemType e){ if(S.top-S.base>=S.stacksize) {S.base=(SElemType*)realloc(S.base,(STACK_INIT_SIZE+S.stacksize)*sizeof(SElemType)); if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize=S.stacksize+STACK_INIT_SIZE;}*S.top=e;S.top++;return OK;}Status Pop(SqStack &S,SElemType &e){ if(S.base==S.top) return ERROR;e=*--S.top;return OK;}void check(){ // 对于输入的任意一个字符串,检验括号是否配对SqStack s;SElemType ch[80],*p,e;if(InitStack(s)) // 初始化栈成功{//printf("请输入表达式\n");scanf("%s",ch);p=ch;while(*p) // 没到串尾switch(*p){case '(':case '[':Push(s,*p);p++;break; // 左括号入栈,且p++case ')':case ']':if(!StackEmpty(s)) // 栈不空{Pop(s,e); // 弹出栈顶元素if(*p==')'&&e!='('||*p==']'&&e!='[')// 弹出的栈顶元素与*p不配对{printf("isn't matched pairs\n");exit(ERROR);}else{p++;break; // 跳出switch语句}}else // 栈空{printf("lack of left parenthesis\n");exit(ERROR);}default: p++; // 其它字符不处理,指针向后移}if(StackEmpty(s)) // 字符串结束时栈空printf("matching\n");elseprintf("lack of right parenthesis\n");}}void main() {check(); }。

表达式括号匹配配对判断 大二数据结构实验

表达式括号匹配配对判断 大二数据结构实验

实验表达式括号匹配配对判断问题1,问题的描述假设一个算法表达式中包括圆括号,方括号两种,设计判别表达式中括号是否正确匹配的算法。

2,数据结构设计(1)匹配判别发生在右括号出现时,且被匹配的左括号应是距离右括号最近被输入的,二不是最先被输入的括号,即“先入后匹配”。

因此用栈来解决。

struct Node{int top;char data[stacksize];};Node node;void InitStack( ) // 初始化栈{node.top=-1;}(2)一是表达式的串;二是栈。

串可以采用顺序表表示。

所以采用顺序栈,站元素类型为字符型。

sqstack(int n){ base=newT[m];if(base=NULL){cout<<“创栈失败”;exit(1);}stacksize=m;top=-1;}}3,算法设计(1)进栈的算法设计voidPush(charx){if(node.top==stacksize-1);node.top++;node.data[node.top]=x;}(2)出栈的算法设计void Pop(char &x){if(node.top==-1);x=node.data[node.top--];}(3)判断是否匹配的算发。

如果右括号,进栈,取下个字符;如果是左括号,出栈,取下个字符;最后判断栈是否为空;得出结论。

3.1因为其中包含几种括号,所以用采用switch语句for(i=0;*(p+i)!='\0'&&count!=0;i++){switch (*(p+i)){case '(' :Push(*(p+i)) ;break ;case '[' :Push(*(p+i) ) ;break ;case ')' :{Pop(e) ;if ( e!='(' )count=0 ;};break ;case ']' :{Pop(e) ;if ( e!='[' )count=0 ;}; break ;default:break;}}3.2利用进出栈判断括号是否匹配if ( !StackEmpty () || count==0 ) //条件为:栈不空,而且有出现括号不匹配的情况{cout<<"括号无法匹配!"<<endl;cout<<"你想要继续吗?(y/n)"<<endl;cin>>s;if(s=='y'||s=='Y')goto input;else if(s=='n'||s=='N')cout<<"退出程序!"<<endl;return 0;}else{cout<<"括号能够匹配!"<<endl;cout<<"你想要继续吗?(y/n)"<<endl;cin>>s;if(s=='y'||s=='Y')goto input;else if(s=='n'||s=='N')cout<<"退出程序!"<<endl;return 0;}4.测试与运行(1)显示菜单,如下图:(2)运行结果如下图:5.调试的收获通过这次实验好的感觉到自己还有不足之处,一个程序高那么久才搞定,以后要多加练习。

数据结构课程设计 舞伴问题

数据结构课程设计 舞伴问题

分类号编号华北水利水电大学North China Institute of Water Conservancy and Hydroelectric Power 课程设计题目舞伴问题院系信息工程学院专业计算机科学与技术姓名贾宁指导教师杨彬第一章需求分析 (2)1.1问题描述 (2)1.2 基本要求 (2)1.2.1 输入及输出格式 (2)1.2.2 程序所完成的功能 (2)第二章概要设计 (3)2.1 数据结构 (3)2.2 程序模块 (4)2.3 模块调用及算法 (5)第三章详细设计 (7)3.1 操作实现 (7)3.2 算法实现 (8)第四章编码调试 (10)4.1 调试环境 (10)4.2 调试方法 (10)4.3 调试项目及调试结果 (10)4.3.1 登陆测试 (10)4.3.2 加载学生信息 (11)4.3.3 学生配对调试 (12)4.3.4 显示总配对 (13)4.3.5 查询配对 (13)第五章总结 (15)参考文献 (16)附录系统源代码 (17)第一章需求分析1.1问题描述一班有m个女生、n个男生(m不等于n), 举办一场舞会. 男女生分别编号坐在舞池两边的椅子上,每曲开始时, 依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴,设计一个程序模拟舞伴配对过程。

1.2 基本要求1.2.1 输入及输出格式输入男、女学生的姓名、性别,由程序自动为男女生编号,可以顺序编号,也可以随机编号,输出每曲配对情况(包括男、女生的姓名、性别和编号)。

原始数据和结果数据要保存到文件中。

在读入男女生信息时,可以从文件中直接读取学生的姓名和性别信息。

输出显示时显示每首歌的配对情况,包括对应配对学生的姓名、性别以及编号。

可以输出整个舞池配对过程的所有配对情况。

将输出显示的内容对应写入到指定的文件中。

1.2.2 程序所完成的功能从文件或者手动输入班级的学生信息,包括姓名和性别基本信息,根据性别使男女生分别坐在舞池两边的座位上,学生的座位编号顺序生成,且一旦编号确定,将不再发生变化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1.1 题目....................................................2...............1.2 问题....................................................2...............2 设计...................................................... 2 ...............2.1 存储结构设计............................................ 2 .............4 对设计和编码的讨论和分析................................. 2..1.4.1 设计................................................... 2..1..4.2 对编码的讨论........................................... 2..1.5 总结和体会.............................................. 2..3 ........... 附录一 ................................................... 2..4 .............本科生课程设计成绩评定表.......................................... 错...误... !未定义书签1 问题描述 ....................................................................................................2 .............1.3 要求......................................................................................................... 2 ..............2.2 主要算法设计........................................................................................... 3 ...........2.3 测试用例及测试结果............................................................................... 6 .........3 调试报告 .................................................................................................... 9 .............数据结构课程设计——判别括号配对1 问题描述1.1 题目:判别括号配对1.2 问题:一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。

写一程序,判断任一算术表达式中所含括号是否正确配对。

1.3 要求:(1)表达式从键盘输入。

(2)利用栈求解此问题。

(3)测试用例自己设计。

2 设计2.1 存储结构设计题目要求利用栈来求解此问题,因此选择顺序栈作为存储结构,具体表示如下:#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct{ char *base; char *top;int stacksize;}SqStack;2.2 主要算法设计2.2.1 算法思想(1)文字描述从键盘输入一个表达式;逐个扫描表达式中的字符;当遇到左括号时,将左括号入栈;继续扫描,将此后遇到的第一个右括号与栈顶元素比较,若匹配,则栈顶元素出栈;否则,继续扫描;当整个表达式扫描完以后,判断栈内是否还有元素,若有,则括号不匹配;若栈为空,则括号配对成功;在括号配对不成功的情况下,利用栈顶栈底元素的差值,可以对左右括号数进行比较(2)流程图表示2.2.2 算法void CharIsCorrect(char a[]){SqStack S;char e;int n,c;InitStack(S);//建立一个空栈n=strlen(a);// 求表达式长度int d=0,b=0;for(int i=0;i<n;i++){ if((a[i]=='(')||(a[i]=='[')||(a[i]=='{'))Push(S,a[i]);else{c=StackEmpty(S);if ((c==1)&&((a[i]==')')||(a[i]==']')||(a[i]=='}')))// 栈为空且当前扫描的字符为右括号时,右括号多于左括号++b;else{e=GetTop(S);if (((a[i]==')')&&(e=='('))||((a[i]==']')&&(e=='['))||((a[i]=='}')&&(e=='{')))// 括号匹配时满足的条件e=Pop(S);else if ((a[i]==')')||(a[i]==']')||(a[i]=='}'))++d;}}// 扫描字符串,左括号进栈,右括号出栈if(StackEmpty(S)==1&&(b==0)&&(d==0))cout<<" 左右括号配对正确"<<endl;// 栈为空时,括号匹配else cout<<" 左右括号不匹配且左括号与右括号个数差为"<<S.top-S.base-d-b<<" 个"<<endl;// 正数表示左括号比右括号多,负数则相反2.3 测试用例及测试结果1)表达式不含除括号外其他字符,配对正确的情况:2)表达式不含除括号外其他字符且左括号少于右括号的情况:4)表达式含任意字符且左右括号个数相同但配对不成功的情况:5)表达式仅含括号且括号个数相同单不匹配的情况:6)表达式仅含括号且左括号对于右括号的情况:3 调试报告1. 本次课程设计,主要的调试过程在于对于判别函数的调试,但是除此之外,由于编译过程中发现了一些错误,对于栈的一些基本操作,以及main 函数,也进行了调试,其中遇到的主要问题如下:(1)大小写出错解决办法:将所有小写s 改为大写S 即可(2)在写“判断栈是否为空”的操作时,将函数的类型标示符写错,导致了如下错误:解决办法:将“void”改为i“nt ”后,能够正常运行中,当用cin 进行输入时出错:解决办法:将char a 改为char a[20] 后编译不出现错误(4)除了以上错误之外,还有一些小错误,编号如下:Error C 2146、error C 2143 、error C 2109 等等,一般再仔细检查后,能够检出错误。

2. 以下,对主要程序进行调试,过程如下:(1) 第一次成型的主体部分代码如下:void CharIsCorrect(char a[]){SqStack S; char e; int n,c;InitStack(S);//建立一个空栈n=strlen(a);// 求表达式长度int m=0;for(int i=0;i<=n;i++){if((a[i]=='(')||(a[i]=='[')||(a[i]=='{'))Push(S,a[i]);else{c=StackEmpty(S);if ((c==1)&&((a[i]==')')||(a[i]==']')||(a[i]=='}')))// 栈为空且当前扫描的字符为右括号时,右括号多于左括号++m;else{e=GetTop(S);while(((a[i]==')')&&(e=='('))||((a[i]==']')&&(e=='['))||((a[i]=='}')&&(e=='{')))// 括号匹配时满足的条件e=Pop(S);}}}// 扫描字符串,左括号进栈,右括号出栈if(!m==0)cout<<" 左右括号不匹配且左括号比右括号少"<<endl;// 栈不为空时,左括号多于右括号else{if(StackEmpty(S)==1)cout<<" 左右括号匹配正确"<<endl;// 栈为空时,括号匹配else cout<<" 左右括号不匹配且左括号比右括号多"<<endl;} 运行结果不正确,结果如下用能够成功配对的两对括号进行测试,测试结果应为“左右括号配对成功”,但测试结果实际为“左右括号不匹配且左括号比右括号少”,测试结果不正确:找到导致错误的原因是while ,while 执行了两次,使栈为空。

将while 改为if 后,问题得到解决。

同时为了提高程序的有效性,在出栈时也设了计数器,同时用左括号与右括号的个数差来表示左右括号的多少,正负数区别左右括号总数谁多谁少(正数左括号多,负数右括号多)。

(2) 第二次修改此时,主体部分修改结果如下:void CharIsCorrect(char a[]){SqStack S;char e;int n,c;InitStack(S);// 建立一个空栈n=strlen(a);// 求表达式长度int d=0,b=0;for(int i=0;i<n;i++){if((a[i]=='(')||(a[i]=='[')||(a[i]=='{'))Push(S,a[i]);else{c=StackEmpty(S);if ((c==1)&&((a[i]==')')||(a[i]==']')||(a[i]=='}')))// 栈为空且当前扫描的字符为右括号时,右括号多于左括号++b;else{e=GetTop(S);if (((a[i]==')')&&(e=='('))||((a[i]==']')&&(e=='['))||((a[i]=='}')&&(e=='{')))// 括号匹配时满足的条件e=Pop(S);else ++d;}}// 扫描字符串,左括号进栈,右括号出栈if(StackEmpty(S)==1&&(b==0)&&(d==0))cout<<" 左右括号配对正确"<<endl;// 栈为空时,括号匹配else cout<<" 左右括号不匹配且左括号与右括号个数差为"<<S.top-S.base-d-b<<" 个"<<endl;//正数表示左括号比右括号多,负数则相反此时,对仅含有括号的表达式进行测试时,未发现任何问题,但在测试含有字母数字等不仅仅只有括号的表达式时,出现错误测试结果如下:输入含有字母的表达式,正确的测试结果为“左右括号不匹配且左括号与右括号个数差为-2”,但实际测试结果如下,测试结果不正确:这是由于在不匹配的情况下,将所有的字符一概视为右括号所致,因此最后一个else 分支处应加上if 限制条件,在仅出现不匹配的右括号时,计数器的值才发生改变,因此将代码做如下修改:(3) 第三次修改:void CharIsCorrect(char a[]){SqStack S;char e;int n,c;InitStack(S);//建立一个空栈n=strlen(a);// 求表达式长度int d=0,b=0;for(int i=0;i<n;i++){ if((a[i]=='(')||(a[i]=='[')||(a[i]=='{'))Push(S,a[i]);else{ c=StackEmpty(S);if ((c==1)&&((a[i]==')')||(a[i]==']')||(a[i]=='}')))// 栈为空且当前扫描的字符为右括号时,右括号多于左括号++b;else{ e=GetTop(S);if (((a[i]==')')&&(e=='('))||((a[i]==']')&&(e=='['))||((a[i]=='}')&&(e=='{')))// 括号匹配时满足的条件e=Pop(S);else if ((a[i]==')')||(a[i]==']')||(a[i]=='}'))++d;}}// 扫描字符串,左括号进栈,右括号出栈if(StackEmpty(S)==1&&(b==0)&&(d==0))cout<<" 左右括号配对正确"<<endl;// 栈为空时,括号匹配else cout<<" 左右括号不匹配且左括号与右括号个数差为"<<S.top-S.base-d-b<<" 个"<<endl;// 正数表示左括号比右括号多,负数则相反}再次进行测试,测试结果均正确,结果如下:1)表达式仅含括号且配对正确:2)表达式仅含括号且左括号少于又括号:3)表达式含字母和括号且左括号少于右括号:4)表达式含任意字符且左右括号个数相同但不匹配:5)表达式仅含括号且括号个数相同但不匹配:6)表达式仅含括号且左括号比右括号多:至此,调试成功,所编写的代码符合题目要求!4.对设计和编码的讨论和分析4.1 设计对于从键盘输入的表达式,其括号配对情况有以下四种:a. 表达式括号配对成功b. 表达式括号配对不成功但左右括号个数相等c. 表达式括号配对不成功且左括号比右括号的个数多d. 表达式括号配对不成功且左括号个数比右括号少因此,对于一个表达式,要判别其括号配对情况,必会得到这四种中的某一种结果,根据每种结果不同于其他结果的特点,分离出该种表达式,从而给出相应的配对结果。

相关文档
最新文档