括号匹配检验
- 格式:doc
- 大小:90.00 KB
- 文档页数:3
1.实验题目括号匹配的检验;2.需求分析本演示程序用VC++6.0编写,完成圆括号、方括号和大括号,其嵌套的顺序随意,即(()[ ])或{([ ] [ ])}等为正确格式,[[ )]或((()均为不正确的格式。
①输入形式:直接输入一串括号;②输出形式:直接输出输入的括号串是否匹配的结果;③程序所能达到的功能:可以多次输入括号串并判断其是否匹配;④测试数据:输入([ ]()),结果“匹配”输入 [( [)],结果“此串括号匹配不合法”3.概要设计1)为了实现上述程序功能,需要定义栈的抽象数据类型:class Stack{数据对象:kh={ai|ai∈count,i=0,1,2,…,n,n≥0}数据关系:基本操作:push(char b)操作结果:把一个数据压进栈pop()操作结果:把一个数据弹出栈pp(char c[])初始条件:栈已存在操作结果:将栈中的元素进行匹配jc()初始条件:栈已存在操作结果:检查栈是否为空若空,返回0;若不空,返回1.clear()操作结果:清空栈2)本程序包含7个函数:①主函数main()②栈的构造函数Stack()③压栈操作函数push(char b)④弹栈操作函数pop()⑤匹配元素函数pp(char c[])⑥检查栈操作函数jc()⑦清空栈操作函数clear()各函数间关系如下:4.详细设计#include<iostream>#include<string>using namespace std;const int maxstack=100;//-------------------------------------------------------------------class Stack{//栈类public:Stack(){count=-1;};//初始化计数conutvoid push(char b);//压栈char pop();//弹栈void pp(char c[]);//匹配括号int jc();//检查是否为空栈void clear(){count=-1;}private:int count;//计数char a[maxstack];//存储};void Stack::push(char b)//压栈函数{if(count>=maxstack);else{count++;a[count]=b;}}char Stack::pop()//弹栈函数{if(count<0);else{return a[count--];}return 0;}int Stack::jc()//检查函数{if(count<0)return 0;return 1;}void Stack::pp(char c[])//匹配函数{int i=0,s=1,t;t=strlen(c);//测试输入的字符串长度if(c[0]==')'||c[0]==']'||c[0]=='}'||t%2==1)//判断是否为奇个括号或第一个为左括号{cout<<"此串括号匹配不合法"<<"\n"<<endl;}else //判断{while(c[i]!='\0'){if(c[i]=='('||c[i]=='['||c[i]=='{'){push(c[i]);}else{if(c[i]==')'){if(pop()!='('){s=0;break;}}if(c[i]==']'){if(pop()!='['){s=0;break;}}if(c[i]=='}'){if(pop()!='{'){s=0;break;}}}i++;}if(s==1){ if(!jc())cout<<"匹配"<<"\n"<<endl;else cout<<"此串括号匹配不合法"<<"\n"<<endl;}if(s==0)cout<<"此串括号匹配不合法"<<"\n"<<endl;}}//-------------------------------------------------------------------int main(){char a[maxstack];//数组Stack kh;//栈对象char h;cout<<"**************************"<<endl;cout<<"*** 括号匹配测试程序 ***"<<endl;cout<<"**************************"<<endl<<endl;do{cout<<"请输入您的选择: 1.运行程序; 2.结束。
字符串中左右括号匹配判断一、要求:判断一个字符串中的小括号是否匹配。
例如,字符串“((())())”中的小括号匹配,而“)()”中的小括号不匹配。
如果匹配则提示匹配,如果不匹配则提示第一个不匹配的括号的位置。
二、效果:三、思路:得到字符串,从头开始,一个一个字符判断。
(1)如果是左括号则压入栈中。
(2)如果是右括号,则将一个左括号从栈中弹出,匹配一对。
若此时栈中无元素,那么这个右括号没有匹配的左括号。
最后,如果栈不为空,则有左括号没有匹配。
四、核心代码:for(i = 0; i < brackets.length(); i++) {if(brackets[i] == '(') {//1.left bracketbracketStack.push('(');if(bracketStack.size() == 1) {bottom = i;}}else if (brackets[i] == ')') {//2.right bracketif(!bracketStack.empty()) {tmp = bracketStack.top();bracketStack.pop();} else {res = nMatch;//move to wrong positioni++;break;}}//ingore non bracket}五、所有代码:代码//BracketMatch.cpp//judge a string whether is brackets match['(' and ')'] string, //while not match,return first position//powered by alan//2010.10.14#include <iostream>#include <string>#include <stack>using namespace std;int main() {//define datastring brackets = "";stack<char> bracketStack;char tmp;enum Res{matched,nMatch}res;res = matched;int bottom = 0;//get inputcout<<"输入需要匹配的括号串"<<endl;cin>>brackets;//judgeint i;for(i = 0; i < brackets.length(); i++) { if(brackets[i] == '(') {//1.left bracketbracketStack.push('(');if(bracketStack.size() == 1) {bottom = i;}}else if (brackets[i] == ')') {//2.right bracketif(!bracketStack.empty()) {tmp = bracketStack.top();bracketStack.pop();} else {res = nMatch;//move to wrong positioni++;break;}}//ingore non bracket}//have '(' not matchif(!bracketStack.empty()){res = nMatch;//get the first not matchi = bottom + 1;}switch(res) {case matched:cout<<"括号字符串匹配!"<<endl;break;case nMatch:cout<<"第"<<i<<"个括号字符串不匹配!"<<endl;break;}return0;}。
括号匹配的检验课程设计一、教学目标本课程的学习目标主要包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握括号匹配的基本原理和方法,理解括号在程序设计中的作用和重要性。
技能目标要求学生能够运用括号匹配的原理和方法解决实际问题,提高编程能力和解决问题的能力。
情感态度价值观目标要求学生培养对编程和计算机科学的兴趣和热情,增强对括号匹配在实际应用中的认识和理解。
二、教学内容本课程的教学内容主要包括括号匹配的基本原理、方法和应用。
首先,介绍括号匹配的基本概念和原理,解释括号在程序设计中的作用和重要性。
然后,教授括号匹配的方法和技巧,包括递归、栈等算法。
最后,通过实际案例和练习题,让学生运用括号匹配的原理和方法解决实际问题,巩固所学知识。
三、教学方法本课程的教学方法采用讲授法、讨论法、案例分析法和实验法等多种教学方法相结合。
首先,通过讲授法向学生传授括号匹配的基本原理和方法。
然后,通过讨论法引导学生进行思考和讨论,加深对括号匹配的理解。
接着,通过案例分析法让学生分析实际案例,运用括号匹配的原理和方法解决实际问题。
最后,通过实验法让学生动手实践,巩固所学知识。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。
教材和参考书用于提供括号匹配的基本原理和方法的讲解和示例。
多媒体资料用于辅助教学,提供图像、动画和视频等直观的教学资源,帮助学生更好地理解和掌握括号匹配的知识。
实验设备用于实验教学,让学生亲自动手实践,增强学习体验。
同时,还可以利用网络资源,如在线编程平台和讨论区,提供更多的学习和交流机会。
五、教学评估本课程的评估方式包括平时表现、作业和考试等。
平时表现主要评估学生的课堂参与度、提问和回答问题的积极性等。
作业主要评估学生的理解和应用能力,要求学生完成相关的练习题和实践项目。
考试主要评估学生对括号匹配的基本原理和方法的掌握程度,包括选择题、填空题和编程题等。
六、教学安排本课程的教学安排规定了教学进度、教学时间和教学地点等。
编写一个括号匹配的检验的程序实习报告在计算机科学领域,括号匹配是一个常见的问题。
括号匹配指的是在一个字符串中,所有的括号都必须正确地成对出现。
如果所有的括号都能正确地匹配,那么该字符串是合法的;否则,该字符串是非法的。
在本次程序实习中,我设计并实现了一个括号匹配的检验程序。
首先,我对括号匹配的问题进行了深入的研究和分析。
我发现,括号匹配问题可以通过使用栈来解决。
栈是一种遵循后进先出原则的数据结构,在括号匹配问题中非常适用。
我使用了一个栈来存储左括号,并在遍历字符串时进行匹配操作。
接下来,我实现了一个简单而高效的括号匹配检验程序。
该程序可以接收一个字符串作为输入,并判断该字符串中的括号是否匹配。
我使用了编程语言(例如C++或Python)来实现该程序,具体的实现细节如下:1. 首先,我创建了一个空栈,用来存储左括号。
2. 然后,我遍历输入的字符串,逐个检查每个字符。
3. 如果当前字符是左括号(例如'('、'{'或'['),则将其推入栈中。
4. 如果当前字符是右括号(例如')'、'}'或']'),则检查栈是否为空。
如果栈为空,则字符串中的右括号没有相应的左括号,该字符串是非法的;如果栈不为空,则将栈顶的左括号弹出并与当前的右括号进行匹配。
如果两个括号不匹配,那么该字符串是非法的。
5. 最后,当遍历完整个字符串后,检查栈是否为空。
如果栈为空,则说明所有的左括号都有相应的右括号,该字符串是合法的;如果栈不为空,则说明字符串中存在未匹配的左括号,该字符串是非法的。
通过实现这个括号匹配的检验程序,我学到了许多关于栈的知识和算法设计的技巧。
此外,我也加深了对括号匹配问题的理解和掌握。
通过编写和调试这个程序,我提高了自己的编程能力和解决问题的能力。
总的来说,本次括号匹配的检验程序实习让我深入了解了括号匹配问题,并通过实际动手编写代码来解决这个问题。
编写一个括号匹配的检验的程序1.实验题目编写一个括号匹配的检验的程序2.需求分析本演示程序用C++编写,完成圆括号、方括号和大括号(选作)的匹配检验,即当输入一串括号后能够判断出此串括号匹配是否合法。
①输入形式和输入范围:括号以字符串形式输入,只输入圆括号、方括号和大括号三种括号,三种括号可以随意嵌套。
②输出形式及功能:当输入任意一串括号后,都会做出判断,输出输入的括号串是否合法。
③测试数据:输入([ ]()),结果“匹配”输入 [(] ),结果“此串括号匹配不合法”3.概要设计1)为了实现上述程序功能,需要定义压栈数据类型:stack<char> openings{数据对象:(symbol∈“(”,“)”,“[”,“]”,“{”,“}”)数据关系:“(”==“)”,“[”==“]”,“{”“}”基本操作:while (is_matched &&(symbol=cin.get())!='\n')操作结果:对括号进行压栈比较,判断下一步是压栈还是弹栈配对。
基本操作:is_matched()操作结果:判断括号是否匹配,在屏幕打印出。
}2)本程序包含3个函数:①主函数main()②压栈弹栈函数symbol=cin.get()③括号匹配比较函数is_matched()各函数间关系如下:mainsymbol=cin.getis_matched4.详细设计实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。
对主程序和其他模块也都需要写出伪码算法。
(1)括号输入while (is_matched &&(symbol=cin.get())!='\n')(2)括号匹配检验is_matched=(5.调试分析(1)由于本程序是通过书本上伪代码改编而来,所以编写时比较简单,程序语把不匹配时的空栈这一点去掉,经过验证我的设计正确,解决了问题,实现了括号匹配的检验程序。
实验三实验报告括号匹配的检验实验题⽬:括号匹配的检验⼀、实验⽬的加深理解栈的定义和特性;掌握栈的存储结构与实现⼆、实验内容:任意输⼊⼀个由若⼲个圆括号、⽅括号和花括号组成字符串,设计⼀个算法判断该串中的括号是否配对。
三、设计与编码1、基本思想基本思想:最内层(最迟出现)的左刮号必须与最内层(最早出现)的同类右刮号配对,它最急切地期待着配对。
配对之后, 期待得以消解。
因此为左刮号设置⼀个栈,置于栈顶的左刮号期待配对的急切程度最⾼。
实例:[ ( [ ] { } ) ]、( [ { } ] )、{ [ ] } )、( { [ ] }、( { [ ] ] )2、编码#include#includeconst int StackSize=100;class SeqStack{public:SeqStack(){top=-1;}~SeqStack(){}void Push(char s);char Pop();void Peidui(char s[StackSize]);private:char data[StackSize];int top;};void SeqStack::Push(char s){if(top==StackSize-1) throw"上溢";top++;data[top]=s;char SeqStack::Pop(){if(top==-1)throw"下溢";else{char a;a=data[top--];return a;}}void SeqStack::Peidui(char *s){int i=0,l=strlen(s);char t;for(i=0;i{if(s[i]=='{'||s[i]=='['||s[i]=='(')Push(s[i]);else{if(top==-1){cout<<"右括号多了,不匹配"<return;}else{t=data[top];if(t=='{'&&s[i]=='}'||t=='['&&s[i]==']'||t=='('&&s[i]==')') {Pop();}elsebreak;}}if(top==-1&&s[i]=='\0')cout <<"配对成功"<elseif(top!=-1&&s[i]=='\0')cout<<"左括号多了,不匹配"<elsecout<<"左右类型不匹配"<}void main(){char str[10];cout<<"请输⼊括号;"<cin>>str;SeqStack S;S.Peidui(str);}四、调试与运⾏1、调试时遇到的主要问题及解决2、运⾏结果(输⼊及输出,可以截取运⾏窗体的界⾯)五、实验⼼得。
实验二、括号匹配一、问题描述假设一个输入字符串中包含圆括号、方括号和花括号三种类型的括号,以及其它一些任意字符。
编写程序,判别串中的括号是否正确匹配,即必须满足以下条件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个元素左右括号不匹配。
合肥学院计算机科学与技术系课程设计报告2008~2009学年第二学期2009年5月题目:表达式的括号匹配检验问题。
试验完成如下要求:假设在表达式中允许有三种括号:圆括号、方括号和花括号,其嵌套的顺序是随意。
要求设计测试数据,如果在表达式中括号使用正确,输出结果为“此表达式中括号匹配合法”,否则输出结果为“此表达式中括号匹配不合法”,#为表达式的起始和结束标志。
在初始和结束时,栈为空。
一、问题分析和任务定义此程序需要完成如下要求:表达式中允许有三种括号:圆括号、方括号和花括号,嵌套顺序随意。
要求设计测试数据,判断表达式中括号使用是否正确,如果正确,输出结果为“此表达式中括号匹配合法”,否则输出结果为“此表达式中括号匹配不合法”,表达式的输出格式为:“#表达式#”。
实现本程序需要解决的几个问题:1、用什么数据结构。
2、怎样实现判断括号是匹配的。
3、括号匹配与不匹配有几种情况。
4、输出与输入数据的形式。
本程序的难点在于怎么样判断括号是否匹配。
按任务书中的提示,首先,建立一个栈,用来存储读入的括号。
若是左括号,则做为一个新的更急迫的期待压入栈,若是右括号,则和当前栈顶的括号比较,若匹配,则输出此表达式中括号匹配合法,若不匹配,则输出此表达式中括号匹配不合法。
括号分为大括号,小括号,中括号,每个括号比较的方法是一样的。
如输入为#(3+2)#:输入#,输入(,“输入3+2,输入“)”,是右括,是左括号,入栈号“(”出栈,与“)”比较,匹配,栈空图1 具体实例演示括号匹配过程由于本程序要求表达式的输入形式是#表达式#,#是表达式的起始与结束的标志,所以判断表达式遍历完的条件是读到第二个#号。
总的来说本题目是一个以栈为数据结构,设计一个求有关于表达式中括号匹配的问题的程序。
数据类型应为字符型,需要自定义栈的结构体,初始栈,入栈,出栈,判断栈空的操作。
本程序用的是顺序栈,用地址连续的存储空间依次存储栈中的元素,并记录当前栈顶数据元素的位置,这样的栈称为顺序栈。
#include<stdio.h>#include<stdlib.h>typedef struct SNode{char data;struct SNode *next;}SNode,*Stack;typedef struct{Stack top;int length;}SqStack;//定义链式栈的结构体char InitStack(SqStack &S){S.top=NULL;S.length=0;return 0;}//初始化链式栈char Push(SqStack &S,char e) {Stack p;p=(Stack)malloc(sizeof(SNode)); if(!p)exit(0); p->data=e;p->next=S.top;S.top=p;S.length++;return 0;}//插入元素echar Pop(SqStack &S){if(!S.top)return 0;else{Stack q;q=S.top;S.top=S.top->next; --S.length;free(q);}return 0;}//删除栈顶元素echar main(){SqStack S;char w,e;InitStack(S);//初始化链式栈printf("提示:输入“ = ”表示输入表达式结束,程序将自动检查括号是否匹配\n\n\n");printf("请输入表达式:\n\n\n");scanf("%c",&w);printf("\n");printf("\n");while(w!='='){switch(w){case '(': Push(S,w);break;case '[': Push(S,w);break;case ')': if(!S.top)return 0;elsee=S.top->data; if(e=='(')Pop(S); break;case ']': if(!S.top)return 0;elsee=S.top->data; if(e=='[')Pop(S); break;default: break;}scanf("%c",&w);}if(S.top==NULL)printf("输入括号匹配\n");else printf("输入括号不匹配,请检查后重新输入\n");return 0;}。
括号匹配检验,是假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即( [ ] ( ) )或[ ( [ ] )]等为正确的格式,[ ( ] )或( [ ( ))或( ( ) ] )均为不正确的格式。
检验括号是否匹配的方法可用“期待的急迫程度”概念来描述。
整个处理过程与栈的特点相吻合。
因此此程序利用链表的头插法特点来完成。
#include "stdlib.h"
#include "stdio.h"
typedef struct Stack
{
char ch;
struct Stack *next;
}Stack,*StackList;
char checkinput() /*检查输入数据的合理性*/
{
char c;
while(1)
{
printf("input the bracket:");
scanf("%c",&c);
getchar();
if(c=='('||c==')'||c=='['||c==']') /*程序的有效性检测*/
break;
else
{
printf("you input wrong! please input again!\n");
continue;
}
}
return c;
}
int InitStack() /*创建栈的实例*/
{
StackList L,s,t;
char c;
int i=0,n=0;
L=(Stack*)malloc(sizeof(Stack));/*创建链表*/
L->next=NULL;
while(1)
c=checkinput();
switch(c)
{
case '(':
case '[':
s=(Stack*)malloc(sizeof(Stack));
s->ch=c;
s->next=L->next; /*头插法实现“栈”的功能*/
L->next=s;
i=++n; /*n用来记录压入栈里的凡是左括号的数目*/
break;
case ')':
case ']':
if(i==0) return 0; /*i用来判断第一次输入的括号是否为右括号,是则退出程序*/
t=L->next;
if(t->ch+1==c) /*检查是否为'('和')',用他们的ACSII码值来检测*/
{
L->next=t->next; /*匹配则删除栈顶元素*/
n--;
printf("此项%c括号匹配!\n",t->ch);
free(t);
}
else if(t->ch+2==c) /*检查是否为'['和']'*/
{
L->next=t->next; /*匹配则删除栈顶元素*/
n--;
printf("此项%c括号匹配!\n",t->ch);
free(t);
}
else return 0; /*此语句判断输入两个括号后不匹配的结果,如'['和')'*/
break;
}
if(n==0)
return 1;
}
main()
{
int i;
i=InitStack() ;
if(i==0)
printf("括号不匹配!请检查括号关系!\n");
else
printf("所有括号完全匹配!\n");
getch();
}
此次程序的重点是如何分析括号匹配的各种情况,也就是程序中必须包含对多中情况的测试用例。
这样才能尽可能多的覆盖这些情况,使得程序完善。