数据结构-括号匹配课程设计报告
数据结构 课程设计 括号匹配
华北科技学院课程设计说明书(数据结构课程设计)班级: 软件B122姓名:_____ 张立宁_______ 设计题目:______括号匹配___________________ 设计时间:_2014-2-17_____至_2014-2-28_______ 指导教师:________郭红_____________________ 评语:_________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:_____1 问题描述与功能需求分析1.1问题描述假设一个算术表达式中可包含三种括号:圆括号,方括号和花括号且这三种括号可按任意次序嵌套使用。
试利用栈的运算,编写判别给定表达式中所含括号是否正确配对出现的算法。
1.2功能需求分析设计一个程序可以判断给定表达式中所含的括号是否正确配对出现。
给定表达式可包含:圆括号,方括号和花括号这三种括号。
2 概要设计2.1总体设计思路依据程序的功能需求,描述该系统功能的结构图如图所示。
2.2模块简介依据程序功能模块的划分各模块定义如下:(1)创建栈:模块名:void InitStack()模块描述:通过此模块创建一片存储空间作为栈(2)压栈:模块名:void push()模块描述:通过此模块把读入的字符压入栈中(3)弹栈:模块名:void pop()模块描述:通过此模块弹出压入栈中字符的栈顶元素(4)判断栈是否为空:模块名:bool Isempty()模块描述:通过判断栈顶是否等于栈底元素来判断是否为空栈(5)进行括号匹配:模块名:bool Match()模块描述:通过此模块对现有的表达式进行判断,其中的括号是否正确匹配3 详细设计3.1数据结构本程序采用栈储存来存储读入的表达式中的括号,可以分为四部分,分别是:结构体定义,构造空栈,构造三个子函数,实现判断功能。
【免费下载】括号匹配实验报告
一、实验目的 (1)掌握栈、队列、串和数组的抽象数据类型的特征。 (2)掌握栈、队列、串和数组的抽象数据类型在计算机中的实现方法。 (3)学会使用栈、队列来解决一些实际的应用问题。
2、实验内容与实验步骤 (1)实验内容:
假设表达式中除了变量名、常量和运算符外,还可以允许两种括号:圆括号和中括号,其嵌套的次序 随意,编写程序检验输入的表达式中括号的的顺序是否合法。
(2)描述抽象数据类型或设计的函数描述,说明为什么要使用这种抽象数据类型,并说明解决设想。 抽象数据类型或函数描述:首先定义了一个结构体并且声明为栈类型,在其中定义了空间基地址的指
针、栈顶指针以及栈存储空间的大小。之后设计了 Creat _Stack 的函数,用此函数来创建一个空栈,这样 可以使用堆栈来实现括号匹配的功能,又设计了一个名为 Stack_Full 的函数了来判断栈是否已满,若栈未 满才可继续之后的压栈功能,如果堆栈已满,则需要使用 realloc 来动态分配空间,扩大栈的存储空间。 我还设计了一个名为 empty 的函数,用它来判断堆栈是否为空,堆栈为空或不为空时分别返回 0 或 1。之 后设计了名为 push 和 pop 的函数来实现括号的入栈和出栈,之后设计了名为 Match 的函数,来判断括号 是否匹配,设计了名为 clean 的函数来清空堆栈,这样可以连续判断不同的多项式的括号是否匹配。
实 验报告
课程名称:数据结构 实验名称:栈、队列、字符串和数 组 实验编号:实验二 指导教师:
班级: 学号:
姓名: 组号:
实验成绩: 批阅教师签字:
实验日期: 实验时间:
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配,料置不试技仅卷术可要是以求指解,机决对组吊电在顶气进层设行配备继置进电不行保规空护范载高与中带资负料荷试下卷高总问中体题资配,料置而试时且卷,可调需保控要障试在各验最类;大管对限路设度习备内题进来到行确位调保。整机在使组管其高路在中敷正资设常料过工试程况卷中下安,与全要过,加度并强工且看作尽护下可关都能于可地管以缩路正小高常故中工障资作高料;中试对资卷于料连继试接电卷管保破口护坏处进范理行围高整,中核或资对者料定对试值某卷,些弯审异扁核常度与高固校中定对资盒图料位纸试置,.卷编保工写护况复层进杂防行设腐自备跨动与接处装地理置线,高弯尤中曲其资半要料径避试标免卷高错调等误试,高方要中案求资,技料编术试5写交卷、重底保电要。护气设管装设备线置备4高敷动调、中设作试电资技,高气料术并中课3试中且资件、卷包拒料中管试含绝试调路验线动卷试敷方槽作技设案、,术技以管来术及架避系等免统多不启项必动方要方式高案,中;为资对解料整决试套高卷启中突动语然过文停程电机中气。高课因中件此资中,料管电试壁力卷薄高电、中气接资设口料备不试进严卷行等保调问护试题装工,置作合调并理试且利技进用术行管,过线要关敷求运设电行技力高术保中。护资线装料缆置试敷做卷设到技原准术则确指:灵导在活。分。对线对于盒于调处差试,动过当保程不护中同装高电置中压高资回中料路资试交料卷叉试技时卷术,调问应试题采技,用术作金是为属指调隔发试板电人进机员行一,隔变需开压要处器在理组事;在前同发掌一生握线内图槽部纸内故资,障料强时、电,设回需备路要制须进造同行厂时外家切部出断电具习源高题高中电中资源资料,料试线试卷缆卷试敷切验设除报完从告毕而与,采相要用关进高技行中术检资资查料料和试,检卷并测主且处要了理保解。护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
括号匹配问题
东华理工大学长江学院课程设计报告数据结构课题设计报告设计题目:括号匹配问题姓名:班级:学号:指导老师:二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.需求和规格说明判断输入的表达式中的括号(包含大括号、中括号、小括号)是否匹配。
程序用MFC实现。
2.设计2.1.设计思想主要通过栈来实现。
先接受用户输入的表达式,过滤掉除括号以外的字符,通过栈匹配。
当是左边括号时,进行压栈。
当是右边括号时,是否与栈顶元素匹配(相应的左括号)。
如果匹配,则出栈,并继续进行下一轮匹配。
如果不匹配,则销毁栈,返回不匹配信息。
2.2.设计表示(1)存储结构typedef struct{char *base;char *top;int stacksize;}SqCharStack;(2)涉及的操作int InitCharStack(SqCharStack &S) //初始化栈。
int DestroyCharStack(SqCharStack &S) //销毁栈。
int CharGetTop(SqCharStack S, char &e) //获取栈顶元素。
int CharPush(SqCharStack &S, char e) //压栈。
int CharPop(SqCharStack &S, char &e) //出栈。
int CTest2Dlg::Correct(const char *express) //括号匹配核心处//理函数。
2.3.实现注释(1)参数说明:InitCharStack(SqCharStack &S)函数参数是要初始化的栈。
通过动态方式分配存储空间。
DestroyCharStack(SqCharStack &S)函数参数是要销毁的栈。
释放动态分配的空间。
CharGetTop(SqCharStack S, char &e)函数第一个参数为被获取的值的栈,第二个参数接受获取的栈顶元素的值。
CharPush(SqCharStack &S, char e)函数第一个参数为栈,第二个参数接受出栈元素的值。
括号匹配课程设计
括号匹配课程设计一、课程目标知识目标:1. 学生能理解括号在程序中的基本概念和作用。
2. 学生能够识别并正确使用不同类型的括号。
3. 学生能够掌握括号匹配的规则和检测方法。
技能目标:1. 学生能够编写简单的程序代码,实现括号的正确配对。
2. 学生能够运用调试工具检查并修正括号不匹配的错误。
3. 学生通过小组合作,解决括号匹配的相关问题,提升团队协作能力。
情感态度价值观目标:1. 学生培养对编程的兴趣,增强学习信息技术的热情。
2. 学生在编程实践中,培养解决问题的耐心和毅力。
3. 学生通过括号匹配的学习,认识到规范书写代码的重要性,形成良好的编程习惯。
课程性质:本课程为信息技术学科编程基础课程,侧重于学生编程能力的培养和实际操作技能的训练。
学生特点:学生为初中年级,对编程有一定的好奇心,具备基本的计算机操作能力,但编程经验不足。
教学要求:教师需采用生动的案例和实际操作,引导学生掌握括号匹配的知识点,注重培养学生的实际编程能力,同时关注学生在学习过程中的情感态度和价值观的培养。
通过具体的学习成果评估,确保学生达到预期的学习目标。
二、教学内容本课程依据课程目标,结合教材内容,安排以下教学大纲:1. 括号概念与分类- 括号的作用和重要性- 不同类型的括号及其应用场景2. 括号匹配规则- 括号匹配的基本原则- 括号不匹配导致的常见错误3. 编程实现括号匹配- 简单的括号匹配程序设计- 递归算法在括号匹配中的应用4. 括号匹配检测方法- 栈在括号匹配检测中的应用- 编程实现括号匹配检测功能5. 实践与拓展- 小组合作,完成括号匹配编程任务- 探讨括号在复杂程序中的作用和优化方法教学内容安排与进度:第一课时:括号概念与分类,了解括号的作用和分类第二课时:括号匹配规则,学习括号匹配的基本原则第三课时:编程实现括号匹配,学习编写简单的括号匹配程序第四课时:括号匹配检测方法,学习使用栈进行括号匹配检测第五课时:实践与拓展,小组合作完成编程任务,探讨括号在复杂程序中的应用教学内容与教材关联性:本教学内容紧密结合教材中关于括号匹配的相关章节,确保学生能够系统地学习和掌握括号匹配的知识点。
数据结构课程设计---括号匹配
数据结构课程设计---括号匹配⽬录1 问题描述 (2)1.1题⽬ (2)1.2问题 (2)1.3要求 (2)2 设计 (2)2.1存储结构设计 (2)2.2主要算法设计 (3)2.3测试⽤例及测试结果 (6)3 调试报告 (9)4 对设计和编码的讨论和分析 (20)4.1设计 (20)4.2对编码的讨论 (21)5 总结和体会 (22)附录⼀ (24)本科⽣课程设计成绩评定表................... 错误!未定义书签。
数据结构课程设计——判别括号配对1问题描述1.1题⽬:判别括号配对1.2问题:⼀个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使⽤。
写⼀程序,判断任⼀算术表达式中所含括号是否正确配对。
1.3要求:(1)表达式从键盘输⼊。
(2)利⽤栈求解此问题。
(3)测试⽤例⾃⼰设计。
2设计2.1存储结构设计题⽬要求利⽤栈来求解此问题,因此选择顺序栈作为存储结构,具体表⽰如下:#define STACK_INIT_SIZE 100#define STACKINCREMENT 10char *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;iif((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<<"左右括号配对正确"<else cout<<"左右括号不匹配且左括号与右括号个数差为"<}2.3测试⽤例及测试结果(1)表达式不含除括号外其他字符,配对正确的情况:(2)表达式不含除括号外其他字符且左括号少于右括号的情况:(3)表达式含任意字符且左括号少于右括号的情况:(4)表达式含任意字符且左右括号个数相同但配对不成功的情况:(5)表达式仅含括号且括号个数相同单不匹配的情况:(6)表达式仅含括号且左括号对于右括号的情况:3调试报告1.本次课程设计,主要的调试过程在于对于判别函数的调试,但是除此之外,由于编译过程中发现了⼀些错误,对于栈的⼀些基本操作,以及main函数,也进⾏了调试,其中遇到的主要问题如下:(1)⼤⼩写出错(2)在写“判断栈是否为空”的操作时,将函数的类型标⽰符写错,导致了如下错误:解决办法:将“void”改为“int”后,能够正常运⾏。
括号匹配栈实验报告
一、实验目的本次实验旨在通过编写程序实现括号匹配功能,加深对栈数据结构原理的理解和应用。
通过实验,掌握栈的基本操作,如入栈、出栈、判断栈空等,并学会利用栈解决括号匹配问题。
二、实验原理1. 栈是一种后进先出(LIFO)的线性数据结构,它只允许在栈顶进行插入和删除操作。
2. 括号匹配问题是指在一个字符串中,判断左右括号是否成对出现,且对应匹配。
3. 在解决括号匹配问题时,可以使用栈来存储遇到的左括号,并在遇到右括号时进行匹配。
如果栈为空或括号不匹配,则判断为无效括号。
如果栈为空,表示括号匹配正确,否则表示不匹配。
三、实验内容1. 定义栈结构体,包括栈的最大容量、栈顶指针、栈底指针、栈元素数组等。
2. 编写栈的基本操作函数,如初始化、入栈、出栈、判断栈空等。
3. 编写括号匹配函数,利用栈实现括号匹配功能。
4. 编写主函数,接收用户输入的字符串,调用括号匹配函数进行判断,并输出结果。
四、实验步骤1. 定义栈结构体和栈的基本操作函数。
```c#define MAX_SIZE 100typedef struct {char data[MAX_SIZE];int top;} Stack;void InitStack(Stack s) {s->top = -1;}int IsEmpty(Stack s) {return s->top == -1;}void Push(Stack s, char x) {if (s->top == MAX_SIZE - 1) { return;}s->data[++s->top] = x;}char Pop(Stack s) {if (s->top == -1) {return '\0';}return s->data[s->top--];}```2. 编写括号匹配函数。
```cint BracketMatch(char str) {Stack s;InitStack(&s);while (str) {if (str == '(' || str == '[' || str == '{') {Push(&s, str);} else if (str == ')' || str == ']' || str == '}') {if (IsEmpty(&s)) {return 0; // 不匹配}char c = Pop(&s);if ((c == '(' && str != ')') || (c == '[' && str != ']') || (c == '{' && str != '}')) {return 0; // 不匹配}}str++;}return IsEmpty(&s); // 栈为空,匹配成功}```3. 编写主函数。
括号匹配检测实验报告
括号匹配检测实验报告本实验旨在设计和实现一个括号匹配检测算法,检测给定字符串中的括号是否正确匹配。
实验原理:括号匹配检测是一种常见的算法问题。
其基本原理是利用栈(Stack)数据结构进行括号的匹配。
当遇到左括号时,将其入栈;当遇到右括号时,判断栈顶元素是否与其对应的左括号相匹配,若匹配则将栈顶元素出栈,继续检测下一个字符;若不匹配,则说明括号不正确匹配,返回匹配失败;最后,若栈为空,则说明所有括号都正确匹配,返回匹配成功。
实验步骤:1. 设计栈数据结构及括号匹配检测算法。
2. 实现算法代码。
3. 设计测试用例,包括正确匹配和不正确匹配的字符串。
4. 运行测试用例,检测算法的正确性和效率。
5. 分析实验结果并撰写实验报告。
实验代码:以下是一个用Python语言实现的括号匹配检测算法示例代码:pythonclass Stack:def __init__(self):self.stack = []def is_empty(self):return len(self.stack) == 0def push(self, element):self.stack.append(element)def pop(self):if not self.is_empty():return self.stack.pop()else:return Nonedef peek(self):if not self.is_empty():return self.stack[-1]else:return Nonedef bracket_match(string):stack = Stack() # 创建栈对象brackets = {'(': ')', '[': ']', '{': '}'}for char in string:if char in brackets: # 左括号入栈stack.push(char)elif char in brackets.values(): # 右括号与栈顶元素匹配if stack.is_empty():return Falseif brackets[stack.peek()] == char:stack.pop()else:return Falsereturn stack.is_empty()# 测试用例test_cases = ["()", "{[]}", "[{()}]", "(}", "{[}]"]for test_case in test_cases:if bracket_match(test_case):print(test_case, "匹配成功")else:print(test_case, "匹配失败")实验结果:运行测试用例,可以得到以下结果:- "()" 匹配成功- "{[]}" 匹配成功- "[{()}]" 匹配成功- "(}" 匹配失败- "{[}]" 匹配失败实验讨论:根据实验结果,我们可以看到算法能够正确地检测出括号的匹配情况。
括号匹配课程设计摘要
括号匹配课程设计摘要一、教学目标本课程的教学目标是帮助学生掌握括号匹配的原理和技巧,培养学生解决实际问题的能力。
具体目标如下:1.知识目标:学生能够理解括号在编程语言中的作用,掌握括号匹配的规则,了解不同编程语言中括号匹配的实现方法。
2.技能目标:学生能够运用括号匹配的知识解决实际编程问题,如编写代码进行括号匹配检查,修复代码中的括号错误等。
3.情感态度价值观目标:通过学习括号匹配,培养学生严谨的编程态度,提高学生解决问题的能力,培养学生的团队合作精神。
二、教学内容本课程的教学内容主要包括括号匹配的原理、括号匹配的技巧以及括号匹配在实际编程中的应用。
具体内容包括:1.括号匹配的原理:介绍括号在编程语言中的作用,讲解括号匹配的规则,如左括号必须与相应的右括号匹配,括号嵌套时的匹配规则等。
2.括号匹配的技巧:介绍如何快速准确地进行括号匹配,如使用栈的数据结构进行括号匹配,编写正则表达式进行括号匹配等。
3.括号匹配在实际编程中的应用:介绍括号匹配在编程实践中的应用,如编写代码进行括号匹配检查,修复代码中的括号错误等。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式进行教学。
具体方法包括:1.讲授法:教师通过讲解括号匹配的原理、技巧以及实际应用,帮助学生掌握相关知识。
2.讨论法:教师学生进行小组讨论,分享括号匹配的心得体会,互相学习和交流。
3.案例分析法:教师提供实际的编程案例,引导学生运用括号匹配的知识解决问题,提高学生的实际操作能力。
4.实验法:教师学生进行编程实验,让学生亲自动手进行括号匹配的操作,巩固所学知识。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选择一本与括号匹配相关的编程教材,作为学生学习的基础资料。
2.参考书:提供一些与括号匹配相关的参考书籍,供学生深入学习参考。
3.多媒体资料:制作一些与括号匹配相关的教学视频、PPT等多媒体资料,帮助学生更好地理解和学习相关知识。
括号匹配检测实验报告(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)}")```四、实验结果与分析通过上述代码,我们对一系列测试用例进行了括号匹配检测。
括号匹配的检验课程设计
括号匹配的检验课程设计一、教学目标本课程的学习目标主要包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握括号匹配的基本原理和方法,理解括号在程序设计中的作用和重要性。
技能目标要求学生能够运用括号匹配的原理和方法解决实际问题,提高编程能力和解决问题的能力。
情感态度价值观目标要求学生培养对编程和计算机科学的兴趣和热情,增强对括号匹配在实际应用中的认识和理解。
二、教学内容本课程的教学内容主要包括括号匹配的基本原理、方法和应用。
首先,介绍括号匹配的基本概念和原理,解释括号在程序设计中的作用和重要性。
然后,教授括号匹配的方法和技巧,包括递归、栈等算法。
最后,通过实际案例和练习题,让学生运用括号匹配的原理和方法解决实际问题,巩固所学知识。
三、教学方法本课程的教学方法采用讲授法、讨论法、案例分析法和实验法等多种教学方法相结合。
首先,通过讲授法向学生传授括号匹配的基本原理和方法。
然后,通过讨论法引导学生进行思考和讨论,加深对括号匹配的理解。
接着,通过案例分析法让学生分析实际案例,运用括号匹配的原理和方法解决实际问题。
最后,通过实验法让学生动手实践,巩固所学知识。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。
教材和参考书用于提供括号匹配的基本原理和方法的讲解和示例。
多媒体资料用于辅助教学,提供图像、动画和视频等直观的教学资源,帮助学生更好地理解和掌握括号匹配的知识。
实验设备用于实验教学,让学生亲自动手实践,增强学习体验。
同时,还可以利用网络资源,如在线编程平台和讨论区,提供更多的学习和交流机会。
五、教学评估本课程的评估方式包括平时表现、作业和考试等。
平时表现主要评估学生的课堂参与度、提问和回答问题的积极性等。
作业主要评估学生的理解和应用能力,要求学生完成相关的练习题和实践项目。
考试主要评估学生对括号匹配的基本原理和方法的掌握程度,包括选择题、填空题和编程题等。
六、教学安排本课程的教学安排规定了教学进度、教学时间和教学地点等。
数据结构实验报告:括号匹配问题
●实验内容:利用栈的基本操作,写一个C程序实现检测表达式“@{(a+b)*[c-d]+e}+f”中的括号是否匹配。
●实验目的:掌握栈的操作●提交内容:C语言源代码:#include <stdio.h>#include <string.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType data[MaxSize];int top;}SeqStack;int InitStack(SeqStack *s){s->top=-1;return 1;}int Push(SeqStack *s,ElemType x){if (s->top == MaxSize -1 ){printf("栈已满,不能入栈.\n");return 0;}else{s->top++;s->data[s->top] = x;}return 1;}int Pop(SeqStack *s,ElemType *x) {if (s->top == -1){printf("栈为空,不能出栈.\n");return 0;}else{*x=s->data[s->top];s->top--;}return 1;}int GetTop(SeqStack *s,ElemType *x) {if (s->top == -1){printf("栈为空,不能取值.\n");return 0;}else{*x=s->data[s->top];}return 1;}int IsEmpty(SeqStack *s) {if(s->top==-1)return 1;return 0;}int Check(char str[],int len) {int i;int a=1,b=0;ElemType x;SeqStack s;InitStack(&s);for(i=0;i<len;i++){if(str[i]=='{'){if(IsEmpty(&s)){if(Push(&s,str[i])!=1){a=0;break;}}else{if(GetTop(&s,&x)!=1){a=0;break;}if(x=='{' || x=='[' || x== '('){a=0;break;}else{if(Push(&s,str[i])!=1){a=0;break;}}}}else if(str[i]=='['){if(IsEmpty(&s)){if(Push(&s,str[i])!=1){a=0;break;}}else{if(GetTop(&s,&x)!=1){a=0;break;}if(x=='[' || x== '('){a=0;break;}else{if(Push(&s,str[i])!=1){a=0;break;}}}}else if(str[i]=='('){if(Push(&s,str[i])!=1){a=0;break;}b=1;}else if(str[i]==')'){if(Pop(&s,&x)!=1){a=0;break;}if(x!='('){a=0;break;}}else if(str[i]==']'){if(Pop(&s,&x)!=1){a=0;break;}if(x!='['){a=0;break;}if(b==0){a=0;break;}}else if(str[i]=='}'){if(Pop(&s,&x)!=1){a=0;break;}if(x!='{'){a=0;break;}if(b==0){a=0;break;}}elsecontinue;}if(!IsEmpty(&s))a=0;return a;}int main(){char str[MaxSize];int i,len;printf("输入字符串:\n");gets(str);len=strlen(str);if(Check(str,len)==0)printf("匹配合法\n");elseprintf("匹配不合法\n");。
表达式的括号匹配检验问题课程设计报告
合肥学院计算机科学与技术系课程设计报告2008~2009学年第二学期2009年5月题目:表达式的括号匹配检验问题。
试验完成如下要求:假设在表达式中允许有三种括号:圆括号、方括号和花括号,其嵌套的顺序是随意。
要求设计测试数据,如果在表达式中括号使用正确,输出结果为“此表达式中括号匹配合法”,否则输出结果为“此表达式中括号匹配不合法”,#为表达式的起始和结束标志。
在初始和结束时,栈为空。
一、问题分析和任务定义此程序需要完成如下要求:表达式中允许有三种括号:圆括号、方括号和花括号,嵌套顺序随意。
要求设计测试数据,判断表达式中括号使用是否正确,如果正确,输出结果为“此表达式中括号匹配合法”,否则输出结果为“此表达式中括号匹配不合法”,表达式的输出格式为:“#表达式#”。
实现本程序需要解决的几个问题:1、用什么数据结构。
2、怎样实现判断括号是匹配的。
3、括号匹配与不匹配有几种情况。
4、输出与输入数据的形式。
本程序的难点在于怎么样判断括号是否匹配。
按任务书中的提示,首先,建立一个栈,用来存储读入的括号。
若是左括号,则做为一个新的更急迫的期待压入栈,若是右括号,则和当前栈顶的括号比较,若匹配,则输出此表达式中括号匹配合法,若不匹配,则输出此表达式中括号匹配不合法。
括号分为大括号,小括号,中括号,每个括号比较的方法是一样的。
如输入为#(3+2)#:输入#,输入(,“输入3+2,输入“)”,是右括,是左括号,入栈号“(”出栈,与“)”比较,匹配,栈空图1 具体实例演示括号匹配过程由于本程序要求表达式的输入形式是#表达式#,#是表达式的起始与结束的标志,所以判断表达式遍历完的条件是读到第二个#号。
总的来说本题目是一个以栈为数据结构,设计一个求有关于表达式中括号匹配的问题的程序。
数据类型应为字符型,需要自定义栈的结构体,初始栈,入栈,出栈,判断栈空的操作。
本程序用的是顺序栈,用地址连续的存储空间依次存储栈中的元素,并记录当前栈顶数据元素的位置,这样的栈称为顺序栈。
数据结构括号匹配实验报告
括号的匹配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;elsereturn TRUE;}virtual ~MyListStack() //析构链栈,释放空间。
数据结构-括号匹配课程设计报告
算术表达式中括号不匹配。
四、 运行环境:
1、 编辑主要环境为 microsoft visualC++6.0。 2、 调试运行环境为 Turbo C2.0。
五、 组员分工情况:
-2-
1、 何洋洋、汪林然负责单链表相关函数的编写; 2、 王煜、洪小龙负责收集相关材料和参考资料; 3、 徐恒、戴文强负责整理、编译和调试。/
int has=1;
/*作为标志,当一对括号匹配时,则 has 置
为 0,否则置为 1*/
if(isempty(aplist))
/*P 为空则返回 0*/
return 0;
while(has)
{
linklist next;
/*设立 next 为 linklist 型变量,用于指向新
的节点*/
has=0;
2、 建立单链表 2,通过 switch,case 语句将单链表 1 中的括号字符全部插入到
单链表 2 中。
3、 调用括号匹配函数将,单链表 2 的头节点调入函数当中,设立标志位 has。
当 has 取 1 时,说明找到一组匹配括号;当 has 取 0 时,当前一组括号不 匹配。设立 temp 指向当前所要判断节点,将 temp 所指节点的值与 temp-〉 next 节点的值相比较,利用匹配括号 ASCII 值相差 1 或 2,相同则相差 0; 或不相同差值不为 1、2 或 0。当 temp 与 temp-〉next 的差值为 1 或 2 时, 说明找到一组匹配括号。Temp=temp-〉next;进行新的判断。当 temp 与 temp-〉next 的差值不为 1 或 2 时,将 temp 赋为 temp-〉next;进行新一轮 的判断。若 temp-〉next-〉next 与 temp-〉next-〉next-〉next 匹配时,此 时将 temp-〉next-〉next 与 temp-〉next-〉next-〉-〉next 全部值为空值。 且 temp-〉next 未找到匹配字符时将 temp 重新赋为 temp->next,进行新的 判断。
数据结构实验报告 顺序栈基本操作 括号匹配检验
三、实验内容
1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、 入栈、出栈以及取栈顶元素操作。 2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术 表达式的值。 主要功能描述如下: (1)从键盘上输入表达式。 (2)(2)分析该表达式是否合法: a) 是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。 b) 是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。 c) 若是其它字符,则返回错误信息。 (3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。 程序中应主要包含下面几个功能函数: void initstack():初始化堆栈 int Make_str():语法检查并计算 int push_operate(int operate):将操作码压入堆栈 int push_num(double num):将操作数压入堆栈 int procede(int operate):处理操作码 int change_opnd(int operate):将字符型操作码转换成优先级 int push_opnd(int operate):将操作码压入堆栈 int pop_opnd():将操作码弹出堆栈 int caculate(int cur_opnd):简单计算+,-,*,/ double pop_num():弹出操作数
-4-
{SElemType_num num; SElemType_op opr; }u; }uu[100]; typedef struct { SElemType_num *base; SElemType_num *top; int stacksize; }SqStack_num; typedef struct { SElemType_op *base; SElemType_op *top;
数据结构括号匹配检验
《数据结构与算法》课程设计报告题目:括号匹配检验四.算法思想利用栈来判断括号是否匹配时,遇到左括号就进栈,遇到右括号则左括号出栈,代表这对括号匹配,如果右括号进栈时,栈为空,则说明缺少左括号,若表达式扫描完栈为空,则说明表达式的括号匹配,否则说明表达式缺少左括号。
五.算法设计程序流程图算法用到的抽象数据类型定义:1.ADT Stack{数据对象:D={a i|a i∈ElemSet,i=1,2,…,n, n≥0}数据关系:R1={<a i-1,a i>|a i-1,a i∈D,i=2, …,n}约定a n端为栈顶,a1端为栈底。
基本操作:(1)I nitStack(&S);操作结果:构造一个空栈S。
(2)S tackEmpty(S);初始条件:栈S已存在。
操作结果:若栈S为空栈,则返回TURE,否则FALUSE。
(3)S tackFull(S);初始条件:栈S已存在。
操作结果:若栈S为满,则返回TURE,否则FALUSE.(4)G etTop(S,&e);初始条件:栈S已存在且非空。
操作结果:用e返回S的栈顶元素。
(5)P ush(&S,e);初始条件:栈S已存在。
操作结果:插入元素e为新的栈顶元素。
(6)P op(&S,&e);初始条件:栈S已存在且非空。
操作结果:删除S的栈顶元素,并用e返回其值。
}ADT Stack∙算法中函数编号及功能要求:1.voidInitStack(SeqStack*S):初始化,构造一个空栈S2.IsEmpty(SeqStack *S):判断栈S为空栈时返回值为真,反之为假3.IsFull(SeqStack *S):判断栈S为满栈时返回值为真,反之为假4.Push(SeqStack *S,StackElementType x):插入元素x为新的栈顶元素5.Pop(SeqStack *S,StackElementType *x):将栈S的栈顶元素弹出,放到x所指的存储空间中6.GetTop(SeqStack *S,StackElementType *x):将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变7.Match(char ch,char str):进行括号的匹配8.BracketMatch(char *str): str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配∙函数之间的调用关系(子程序编号见上):主函数调用函数8函数8调用函数1、2、4、5、6、7六.C语言实现的程序清单/*******括号匹配的检验********/#define TRUE 1#define FALSE 0#define Stack_Size 50#define StackElementType char#include "stdio.h"/*顺序栈*/typedef struct{StackElementType elem[Stack_Size]; /*用来存放栈中元素的一维数组*/int top; /*用来存放栈顶元素的下标,top为-1表示空栈*/}SeqStack;/*初始化*/void InitStack(SeqStack *S){/*构造一个空栈S*/S->top = -1;}/*判栈空*/int IsEmpty(SeqStack *S) /*判断栈S为空栈时返回值为真,反之为假*/{return(S->top==-1?TRUE:FALSE);}/*判栈满*/int IsFull(SeqStack *S) /*判断栈S为满栈时返回值为真,反之为假*/{return(S->top==Stack_Size-1?TRUE:FALSE);}int Push(SeqStack *S,StackElementType x){if(S->top==Stack_Size-1)return(FALSE); /*栈已满*/S->top++;S->elem[S->top] = x;return(TRUE);}int Pop(SeqStack *S,StackElementType *x){/* 将栈S的栈顶元素弹出,放到x所指的存储空间中*/if(S->top == -1) /*栈为空*/return(FALSE);else{*x = S->elem[S->top];S->top--; /* 修改栈顶指针*/return(TRUE);}}/*取栈顶元素。
课程设计报告——括号匹配问题
课程设计报告——括号匹配问题1. 设计目的1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
2. 设计内容2.1 系统名称括号匹配问题:括号匹配问题就是给定任意判别式,然后检验括号的配对出现的情况。
2.2要求假设一个算术表达式中可包含三种括号:圆括号、中括号、花括号且这三种括号可按任意次序嵌套使用。
试利用栈的运算,编写判别给定式中所含括号是否正确配对出现的算法。
任意运用一种计算机语言,分析问题,写出具体程序,要求能够在对应的系统中实现该问题的,实验通过计算机来完成。
独立完成,可通过查阅资料来解决自己不会的问题,提高自己查阅文献的能力级独立思考的能力。
3.程序设计步骤3.1程序流程分析图图3-1 程序流程图3.2主要的数据结构类型typedef struct{int top;char Szstack[MaxSize];}Text;3.3 程序功能模块函数(1) 检验栈是否为空bool IsEmpty(Text G){if(G.top==-1)return true;elsereturn false;}(2) 检验栈是否为满bool IsFull(Text G){if(G.top==MaxSize-1)return true;elsereturn false;}( top=%d \n\n",G.top);break;case'[':G.Szstack[++(G.top)]=c;printf(" 压入[ top=%d \n\n",G.top);break;case'{':G.Szstack[++(G.top)]=c;printf(" 压入{ top=%d \n\n",G.top);break;case')':if(Pop(G)!='('){return 0;}else{G.Szstack[G.top--];printf(" 当遇) 出栈( top=%d\n\n",G.top);break;}case']':if(Pop(G)!='[')return 0;else{G.Szstack[G.top--];printf(" 当遇] 出栈[ top=%d\n\n",G.top);break;}case'}':if(Pop(G)!='{')return 0;else{G.Szstack[G.top--];printf(" 当遇} 出栈{ top=%d\n\n",G.top);break;}default:break;}}if(!IsEmpty(G))return 0;return 1;}3.4程序实现中函数之间的调用先进行函数声明,在定义函数,再在功能函数及主函数中调用函数,实现检验括号匹配的问题。
数据结构中关于括号匹配问题的算法
《数据结构》实验报告二实验内容:括号匹配学号:姓名:一、上机实验的问题和要求(需求分析):[ 题目] 假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])] 等为正确格式,[(])或(((]均为不正确的格式。
读入含圆括号和方括号的符号序列,输出“匹配”或“此串括号匹配不合法”。
二、程序设计的基本思想,原理和算法描述:本程序是在实现栈的基本操作的基础上实现其基本应用,即括号匹配问题,重点利用其“先进后出”的特性三、调试和运行程序过程中产生的问题及采取的措施:(略)四、源程序及注释[ 源程序] 程序名: 4.cpp#include "stdio.h"#include "malloc.h"#include "process.h"#define stack_int_size 8#define stackincrement 10#define overflow -2#define error 0#define ok 1typedef int status;typedef char selemtype;typedef struct{ selemtype * base;selemtype * top;int stacksize;}sqstack;status initstack(sqstack &s){//构造一个空栈ss.base=(selemtype *)malloc(stack_int_size * sizeof(selemtype));if(!s.base)exit(overflow);s.top=s.base;s.stacksize=stack_int_size;return ok;}//initstackstatus emptystack(sqstack s){if(s.top==s.base)return ok;else return error;}status push(sqstack &s,selemtype e){//插入元素e为新的栈顶元素int stacksize;if(s.top-s.base>=s.stacksize){s.base=(selemtype *)realloc(s.base, (s.stacksize+stackincrement )* sizeof(selemtype));if(!s.base)exit (overflow);s.top=s.base+s.stacksize;s.stacksize+=stackincrement;}*s.top++=e;return ok;}//pushstatus pop(sqstack &s,selemtype &e){//若栈不为空,则删除s的栈顶元素,用e返回其值if(s.top==s.base)return error;e=* --s.top;return ok;}//popint kuohao(char m[]){ //若括号匹配则返回1,否则返回0;sqstack s;int i=0;char x;initstack(s);while(m[i]!='#'){ if(m[i]=='('||m[i]=='[')push(s,m[i]);if(m[i]==')'||m[i]==']'){ if(emptystack(s))return 0;else{pop(s,x);if((x=='('&&m[i]==']')||(x=='['&&m[i]==')'))return 0; } }i++;}if(emptystack(s))return 1;else return 0;}void main (){ char e[7]={'(','(','(',']',')',']','#'};int p;p=kuohao(e);printf("说明:若括号匹配的话,输出结果为1,反之则为0.\n");printf("判断结果为:%d\n",p); }五、运行结果如输入的括号序列为:'(','(','(',']',')',']','#'运行结果:0(表明括号不匹配)。
括号匹配实验报告
本科生实验报告实验课程数据结构学院名称核技术与自动化工程学院专业名称测控技术与仪器专业学生姓名学生学号指导教师实验地点6C802实验成绩二〇16年3 月二〇16 年 3月填写说明1、适用于本科生所有的实验报告(印制实验报告册除外);2、专业填写为专业全称,有专业方向的用小括号标明;3、格式要求:①用A4纸双面打印(封面双面打印)或在A4大小纸上用蓝黑色水笔书写。
②打印排版:正文用宋体小四号,1.5倍行距,页边距采取默认形式(上下2.54cm,左右2.54cm,页眉1.5cm,页脚1.75cm)。
字符间距为默认值(缩放100%,间距:标准);页码用小五号字底端居中。
③具体要求:题目(二号黑体居中);摘要(“摘要”二字用小二号黑体居中,隔行书写摘要的文字部分,小4号宋体);关键词(隔行顶格书写“关键词”三字,提炼3-5个关键词,用分号隔开,小4号黑体);正文部分采用三级标题;第1章××(小二号黑体居中,段前0.5行)1.1 ×××××小三号黑体×××××(段前、段后0.5行)1.1.1小四号黑体(段前、段后0.5行)参考文献(黑体小二号居中,段前0.5行),参考文献用五号宋体,参照《参考文献著录规则(GB/T 7714-2005)》。
一、问题描述假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[()等为不正确的格式。
检验括号是否匹配。
二、问题分析(1)数据条件要求输入随意含有[,],(,),{,},的数据利用栈的特性完成此次括号匹配。
(2)操作条件要求Visual C++中利用栈的应用表达此过程三、数据结构设计(1)逻辑结构设计栈的结构运行(2)物理结构设计栈的应用四、算法设计(核心子函数)(1)算法列表(2)算法描述(描述核心算法).. Seqstack *Seqstack_Init(){Seqstack *seqstack;seqstack=(Seqstack *)malloc(sizeof(Seqstack));seqstack->top=0;return seqstack;}int Seqstack_Pop(Seqstack *seqstack){if (seqstack->top==0){printf("栈为空\n");return 0;}seqstack->top--;return seqstack->ch[seqstack->top];}void seqstack_Push(Seqstack *seqstack,char c){if (seqstack->top==Length){printf("栈溢出\n");return ;}seqstack->ch[seqstack->top]=c;seqstack->top++;}void check_symbol(Seqstack *seqstack,char *a){int i;seqstack_Push(seqstack,a[0]);for (i=1;i<strlen(a);i++){if((a[i]==']'&&seqstack->ch[seqstack->top-1]=='[')||(a[i]==')'&&seqstack->ch[seqstack ->top-1]=='(')||(a[i]=='}'&&seqstack->ch[seqstack->top-1]=='{')){Seqstack_Pop(seqstack);}else{seqstack_Push(seqstack,a[i]);}}if(seqstack->top==0){printf("括号匹配\n\n");}else{printf("括号不匹配\n\n");}利用栈的先进后出的性质完成括号匹配的要求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参*/
if(isempty(p))
/*判断 P 是否为空,p 为空则表达式
中括号匹配*/
{
printf("True\n");
printf("the kuo hao in expression is pipei\n");
}
else
/*P 不为空,则表达式中括
号不匹配*/
{ printf("False\n");
void main()
/*主函数*/
{
char test[LEN];
int i;
list a,b;
linklist p,q=&b;
/*设立 P 为 list 结点指针*/
p=&a;
/*使 P 指向头结点 a*/
initlist(p);
/*使 p 为第一个节点*/
printf("Pliease input the expression:\n");
二、 要求:
1. 将算术表达式保存在带头结点的单链表中; 2. 在 1 中建立的单链表上实现括号匹配问题的求解。 三、 解决问题思路:
1、 首先建立带头结点的单链表,单链表的数据域存储字符数据,指针域为结
点型指针。设立字符型数组先将算术表达式输入到数组当中,通过插入节 点函数将数组中字符全部插入到单链中 1 中。
int isempty(linklist aplist)
/*判断头结点是否为空函数*/
{
linklist next;
return aplist->next==NULL?1:0; /*头结点不为空侧返回 0*/
}
int creatlist_node(linklist aplist,char a) /*插入字符节点函数*/
2、 在创建单链表过程中,发现许多问题,指针转换错误经常出现,定义变量, 调用函数方面也经常出现错误。后来只能查看《C 程序设计教程》,来检 查错误。分析原因很可能是因为长时间未接触 C 语言,有些生疏,以致 于经常出错。
3、 在最初编写程序时感到无从下手,思路有些不清晰,可能主要是原因平时 上课时没有认真听讲,没有系统的掌握编写一个算法的基本方法、步骤。 应从平时上课中打好基础,学会分析问题、解决问题。
4、 最后,若单链表 p 为空则则说明表达式中括号匹配;若 p 不为空,则说明
算术表达式中括号不匹配。
四、 运行环境:
1、 编辑主要环境为 microsoft visualC++6.0。 2、 调试运行环境为 Turbo C2.0。
五、 组员分工情况:
-2-
1、 何洋洋、汪林然负责单链表相关函数的编写; 2、 王煜、洪小龙负责收集相关材料和参考资料; 3、 徐恒、戴文强负责整理、编译和调试。/
scanf("%80s",test);
for(i=0;i<LEN;i++)
creatlist_node(q,test[i]);
/*将数组中算术表达式存入单链
表 q 中*/
for(i=0;i<LEN;i++,q=q->next)
-3-
{
switch(q->node)
{
case '[':
case ']':
-7-
if(!anode)
exit(-1);
anode->node=a;
anode->next=NULL;
bplist->next=anode;
return 0;
}
int Testlist(linklist aplist) /*判断算术表达式中括号是否匹配函数*/
{
linklist temp;
/*设立 list 型节点 temp 作为临时变量*/
2、 建立单链表 2,通过 switch,case 语句将单链表 1 中的括号字符全部插入到
单链表 2 中。
3、 调用括号匹配函数将,单链表 2 的头节点调入函数当中,设立标志位 has。
当 has 取 1 时,说明找到一组匹配括号;当 has 取 0 时,当前一组括号不 匹配。设立 temp 指向当前所要判断节点,将 temp 所指节点的值与 temp-〉 next 节点的值相比较,利用匹配括号 ASCII 值相差 1 或 2,相同则相差 0; 或不相同差值不为 1、2 或 0。当 temp 与 temp-〉next 的差值为 1 或 2 时, 说明找到一组匹配括号。Temp=temp-〉next;进行新的判断。当 temp 与 temp-〉next 的差值不为 1 或 2 时,将 temp 赋为 temp-〉next;进行新一轮 的判断。若 temp-〉next-〉next 与 temp-〉next-〉next-〉next 匹配时,此 时将 temp-〉next-〉next 与 temp-〉next-〉next-〉-〉next 全部值为空值。 且 temp-〉next 未找到匹配字符时将 temp 重新赋为 temp->next,进行新的 判断。
int has=1;
/*作为标志,当一对括置为 1*/
if(isempty(aplist))
/*P 为空则返回 0*/
return 0;
while(has)
{
linklist next;
/*设立 next 为 linklist 型变量,用于指向新
的节点*/
has=0;
temp=aplist;
/*使 temp 指向第一个节点*/
while(temp->next)
/*若第 2 个节点不为空,进入 while 循环
*/
{
if(temp->next->next) /*若第 3 个节点不为空,继续判断*/
{
if((temp->next->next->node-temp->next->node==1)||(temp->next->next->node-t emp->next->node==2)) /*若第 3 个节点字符值减去第 2 个节点字符值为 1 或 2 则条件成立进入 if 语句*/
2、输入表达式②2x+{[2y+2z-(2x-3y)*5]+43*5z-32}*12 结果如下:
3、输入表达式③
结果如下:
4、输入表达式纯括号类型如: 况不符。
则输出结果为错误,与实际状
-6-
九、 讨论部分:
1、 在单链表之后,从数组中提取字符输入到单链表中时,无法正确输进去, 后来找同学查看,发现指针有些错误。经过修改之后,可将字符成功插入 到单链表中。经过讨论后得知指针未正确指向头结点。
安徽三联学院 《数据结构》课程设计
班级: 计 算 机 科 学 与 技 术 系
计算机科学与技术专业 2008 级(2)班
组别:
第八 组
组长:
徐恒
组员:何洋洋、枉林然、魏世捷、王煜、戴文强
完成日期:2010.1.20
-1-
题目:括号匹配检验
一、问题描述:
假设一个算术表达式可以包含 3 种括号:圆括号“(”和“)”,方括号“[”和“]”, 和花括号“{”和“}”且这三种括号可按照任意次序嵌套使用(如:…[…{…}… […]…]…[…]…(…)…)。设计一个程序,判别所给定表达式中所含括号是否 匹配。
/*建立 list 型 anode 节点,将
-4-
字符 a 插入*/
{
linklist bplist=aplist,anode;
/*设立 bplist 作为中间变量用于添加节点
*/
while(bplist->next)
{
bplist=bplist->next;
}
anode=(linklist)malloc(sizeof(list)); /*构造一个 list 型节点并分配空间 */
struct list *next; /*指针域*/
}list,*linklist;
/*节点类型*/
void initlist(linklist);
/*函数声明*/
int isempty(linklist);
int creatlist_node(linklist,char);
Textlist(linklist);
{ temp->next=temp->next->next->next; /*将节点 1 赋值为节点
3*/ has=1; /*标志 has 重置为 1*/
} else
-5-
temp=temp->next;/*若第 3 个节点字符值减去第 2 个节点字符
值为 0 则将 temp 置为下一个节点*/
}
printf("the kuo hao in expression is not pipei\n");
}
}
void initlist(linklist aplist)
/*构造头结点函数*/
{
struct list *next;
aplist->next=NULL;
aplist->node='\0';
}
六、 遇到的困难及解决问题的办法:
1、 最后在调试程序时发现许多错误,例如函数类型不匹配、没有合适的指针、 未定义变量、句法错误、函数声明错误、不合法的指针、有未使用的变量、 定义不正确等。先是找同学帮助,然后自己学着改错。慢慢的自己学会改 错,并找到相关资料来找出的修改方法。
2、 遇到实在不懂的地方,就找组员和同学一起讨论,找到问题的根本原因, 然后加以纠正。