实验 表达式括号匹配配对判断问题

合集下载

数据结构中关于括号匹配问题的算法

数据结构中关于括号匹配问题的算法

《数据结构》实验报告二实验内容:括号匹配学号:姓名:一、上机实验的问题和要求(需求分析):[ 题目] 假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])] 等为正确格式,[(])或(((]均为不正确的格式。

读入含圆括号和方括号的符号序列,输出“匹配”或“此串括号匹配不合法”。

二、程序设计的基本思想,原理和算法描述:本程序是在实现栈的基本操作的基础上实现其基本应用,即括号匹配问题,重点利用其“先进后出”的特性三、调试和运行程序过程中产生的问题及采取的措施:(略)四、源程序及注释[ 源程序] 程序名: 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(表明括号不匹配)。

设计算法判断一个算术表达式的圆括号是否配对

设计算法判断一个算术表达式的圆括号是否配对

#include<stdio.h>#include<stdlib.h>typedef struct node{char ch;node *next;}Linkstack;Linkstack *Setstack(){ //创建空链栈Linkstack *S;S=(Linkstack *)malloc(sizeof(Linkstack));S->next=NULL;return S;}Linkstack *Pushstack(Linkstack *S,char c){ //入栈Linkstack *p;p=(Linkstack *)malloc(sizeof(Linkstack));p->ch=c;p->next=S->next;S->next=p;return S;}Linkstack *Popstack(Linkstack *S){ //出栈Linkstack *p;p=S->next;S->next=p->next;free(p);return S;}char Gettop(Linkstack *S){ //取栈顶数据if(S->next!=NULL)return S->next->ch;elsereturn ' ';}int Judgepair( ){ //判断圆括号是否正确配对Linkstack *p;char c;int sign=1;p=Setstack();printf("请输入算术表达式,并以'#'结束!\n");c=getchar();while(c!='#'){switch(c){case'(': //扫描到'('入栈p=Pushstack(p,c);break;case')': //扫描到')',判断栈顶是否是'('if(Gettop(p)=='(') //若栈顶是'(',则出栈p=Popstack(p);else //若栈顶不是'(',则配对错误sign=0;break;}if(sign==0)break;elsec=getchar();}if(p->next!=NULL) //最后查看栈中是否为空sign=0;return sign;}void Judgeout(int a){ //判断结果输出if(a==1)printf("算术表达式圆括号配对正确!\n");if(a==0)printf("算术表达式圆括号配对错误!\n");}void main(){Judgeout(Judgepair());}实验题目:设计算法判断一个算术表达式的圆括号是否配对。

表达式括号匹配配对判断问题

表达式括号匹配配对判断问题

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

2.源程序#include<iostream>//#include<process>using namespace std;typedef char T;//template<class T> //1处//struct Node//{// T *base;// int top;// int stacksize;//};//template<class T>class Sqstack{private:T *base;int top;int stacksize;public:Sqstack(int m);~Sqstack(){}void Push(T x);T Pop();void Index(char *s,int n);};template<class T>Sqstack<T>::Sqstack(int m){base=new T[m];if(base==NULL){cout<<"栈创建失败,退出!"<<endl;exit(1);}stacksize=m;top=-1;}template<class T>void Sqstack<T>::Push(T x){if(top==stacksize-1)throw"栈满,无法入栈";top++;base[top]=x;}template<class T>T Sqstack<T>::Pop(){T x;if(top==-1)throw"栈空,不能出栈";x=base[top--];return x;}template<class T>void Sqstack<T>::Index(char *s,int n){for(int i=0;i<n;i++){if(s[i]=='('||s[i]=='[') Push(s[i]);if(s[i]==')'){if(base[top]=='(') Pop();else{if(top==-1) {cout<<"不匹配:多右括号)";exit(1);}else {cout<<"不匹配:[与)匹配错";exit(1);}}}if(s[i]==']'){if(base[top]=='[') Pop();else{if(top==-1) {cout<<"不匹配:多右括号]";exit(1);}else {cout<<"不匹配:(与]匹配错";exit(1);}}}}if(top==-1) cout<<"匹配";else{if(base[top]=='(') cout<<"不匹配:多左括号(";if(base[top]=='[') cout<<"不匹配:多左括号[";}}int main(void){Sqstack<T> L(20);int n;char s[20];cout<<"输入一个表达式:";cin>>s;n=strlen(s);L.Index(s,n);return 0;}3. 测试与运行。

数据结构实验表达式括号匹配配对判断问题分析

数据结构实验表达式括号匹配配对判断问题分析
实验 表达式括号匹配配对判断问题
姓名:
班级:
学号:
实验时间:
1. 问题描述
一个算术表达式含圆括号、中括号、花括号 , 且它们可任意嵌套使用。
写一程序,判断任一算术表达式中所含括号是否正确配对。
2. 数据结构设计
匹配判别发生在右括号出现时, 且被匹配的左括号应是距离右括号最近
被输入的,二不是最先被输入的括号
return 0; break;
case '}': if(Pop(s)!='{') return 0; break;
case ']': if(Pop(s)!='[')
return 0; break; } } int re=0; // 定义并初始化判空函数的返回值 re=Empty(s,re); // 返回判空函数的返回值 if(re==1) return 1; // 栈为空 else return 0; // 栈不为空,有左括号,存在 '(' 或'[' 或'{' 未匹配 } 4. 运行与测试 ① 输入 1+(2+3)
void main() // 主函数 {
char str[100]; // 定义一个单字符型数组以储存键盘输入的字符串。 cout<<" 请输入一个长度小于 100 的字符串: "<<endl; cin>>str; // 从键盘输入字符存储到字符数组中,有输入则继续。 int re=Check(str); if(re==1)
stack s;
InitStack(s);
int strn = strlen(str); //

括号配对问题实验报告(3篇)

括号配对问题实验报告(3篇)

第1篇一、实验目的本研究旨在探讨括号配对问题(Balanced Parentheses Problem)的解决策略,分析不同背景知识、认知风格和问题解决经验对括号配对问题解决的影响,以期为相关教学和实践提供参考。

二、实验背景括号配对问题是一种典型的逻辑推理问题,主要考察个体对括号结构的理解和运用能力。

在计算机科学、数学、逻辑学等领域中,括号配对问题具有广泛的应用。

然而,由于括号配对问题的复杂性,许多人难以在短时间内解决此类问题。

因此,研究括号配对问题的解决策略具有重要的理论意义和实际应用价值。

三、实验方法1. 实验对象:选取60名大学生作为实验对象,随机分为三组,每组20人。

其中,A组为计算机科学专业学生,B组为数学专业学生,C组为非计算机及数学专业学生。

2. 实验材料:设计50道括号配对问题,分为易、中、难三个难度级别,每级各15道题。

3. 实验步骤:(1)对实验对象进行分组;(2)对实验对象进行括号配对问题解决能力测试,包括易、中、难三个难度级别的题目;(3)收集实验数据,分析不同背景知识、认知风格和问题解决经验对括号配对问题解决的影响。

四、实验结果与分析1. 不同背景知识对括号配对问题解决的影响A组学生在易、中、难三个难度级别的括号配对问题解决中均优于B组和C组。

这说明计算机科学专业学生在括号配对问题解决方面具有明显优势。

2. 认知风格对括号配对问题解决的影响在易、中、难三个难度级别的括号配对问题解决中,A组和B组学生的直觉型认知风格与逻辑型认知风格无明显差异。

然而,C组学生的直觉型认知风格在易、中、难三个难度级别的括号配对问题解决中均低于逻辑型认知风格。

3. 问题解决经验对括号配对问题解决的影响A组和B组学生在易、中、难三个难度级别的括号配对问题解决中均优于C组。

这说明问题解决经验在括号配对问题解决中具有重要作用。

五、结论与建议1. 结论(1)括号配对问题解决能力与个体背景知识、认知风格和问题解决经验密切相关;(2)计算机科学专业学生在括号配对问题解决方面具有明显优势;(3)问题解决经验在括号配对问题解决中具有重要作用。

实验三实验报告括号匹配的检验

实验三实验报告括号匹配的检验

实验三实验报告括号匹配的检验实验题⽬:括号匹配的检验⼀、实验⽬的加深理解栈的定义和特性;掌握栈的存储结构与实现⼆、实验内容:任意输⼊⼀个由若⼲个圆括号、⽅括号和花括号组成字符串,设计⼀个算法判断该串中的括号是否配对。

三、设计与编码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、运⾏结果(输⼊及输出,可以截取运⾏窗体的界⾯)五、实验⼼得。

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个元素左右括号不匹配。

数据结构实验(括号配对问题)

数据结构实验(括号配对问题)

数据结构实验(括号配对问题)⼀、实验题⽬设计算法判断⼀个算数表达式的圆括号是否正确配对。

⼆、问题分析这道题⽤到的是栈的知识,这个程序要求我们知道如何对⼀个字符串进⾏存储,判断算数表达式是否配对正确的关键是对表达式进⾏扫描,熟悉圆括号的进出栈操作。

三、概要设计1)为了实现上述程序功能,需要:[1]建⽴⼀个顺序栈;[2]键盘输⼊⼀个表达式,并对其进⾏扫描;[3]当扫描到“(”就进⾏⼊栈操作,遇到“)”就将栈顶元素出栈,扫描到其他元素不进⾏任何操作;[4]扫描完表达式,判断栈是否为空。

若为空,则匹配正确,反之错误。

2)本程序包含的函数:[1]主函数main()[2]void Bracket()四、详细设计1)定义顺序栈类型Typedefstruct{Char stack[StackMaxSize];Int top;}Stack;2) [1]⾸先将定义⼀个栈S置成空栈,InitStack(S);[2]然后在main()⾥定义字符串str[100],并将其输⼊gets(str);[3]接着利⽤while(str[i]!=’\0’)语句对字符串进⾏扫描[4]如果遇到“(“就执⾏push(S,’(‘)操作,遇到”)“就进⾏删除栈顶元素操作;[5]最后判断栈是否为空,StackEmpty(S)。

五、调试分析在⼀开始的试验中,在判断括号是否判断正确的if语句中if(!flag1&&flag2),这样得到的结果就不正确了,如图:解决⽅法:将判断括号配对是否正确的if语句中if(!flag1&&flag2)改为if(!flag2)这样只要判断flag2标志的栈是否为空,从⽽得到括号是否配对正确。

六、测试结果:1)测试数据:4+(4+5),))((,)+(),)+()+(2)测试结果截图:七、附录(源代码)#includevoid Bracket(char *str);void main()//主函数{char str[100];//定义⼀个字符串printf("please input:");gets(str);Bracket(str);}#define StackMaxSize 100 typedefstruct{//定义⼀个顺序栈类型char stack[StackMaxSize]; int top;}Stack;Stack *InitStack(Stack *S)//置空栈{S->top=-1;return S;}intStackEmpty(Stack *S)//判栈空{return S->top==-1;}char Pop(Stack *S,char *a)//顺序栈取栈顶元素{*a=S->top;if(S->top<=StackMaxSize-1&&S->top>=0) return(S->stack[S->top]);elseprintf("error");}void Push(Stack *S,charstr){//顺序栈⼊栈if(S->toptop>=-1){ S->top++;S->stack[S->top]=str;}elseprintf("error");}void Bracket(char *str){Stack S1,*S=&S1char a;inti=0,flag1=0,flag2;InitStack(S);while(str[i]!='\0'){switch(str[i]){case '(':Push(S,'(');break;case ')':Pop(S,&a);if(a!='('){flag1=1;break;//出现不匹配,⽴即结束循环}default:break;}if(flag1)break;i++;}flag2=StackEmpty(S);//flag2判断堆栈是否为空if(!flag2) printf("括号匹配正确\n");elseprintf("括号匹配不正确\n");}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int Check(char* str)
{ //检验括号是否匹配的函数
stack s;
InitStack(s);
int strn = strlen(str); //定义字符串长度为strn
for(int i=0;i <strn;i++)
{
char a=str[i];
int re=0;
switch(a)
实验
姓名:贾柯柯班级:计162
学号:1613023052实验时间:2017.10.28
1.问题描述
一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。写一程序,判断任一算术表达式中所含括号是否正确配对。
2.数据结构设计
匹配判别发生在右括号出现时,且被匹配的左括号应是距离右括号最近被输入的,二不是最先被输入的括号,即“先入后匹配”。因此用栈来解决。
return a;
}
2)出栈的算法设计
char Pop(stack &s )
{ //出栈操作
if(s.top == -1) //当栈顶为-1时,栈空
return 0;
char a = s.strstack[s.top];//将栈顶元素赋予字符a,并返回字符a,完成出栈操作
s.top--;
return a;
#define stacksize 100 //定义栈的空间大小
struct
stack{ //定义栈的结构体
char strstack[stacksize];//定义栈的存储格式为字符型
int top; //定义栈的栈顶变量
};
void InitStack(stack &s)
{//定义一个新栈s,初始化栈顶为-1
}
(3)判断栈是否为空的函数
int Empty(stack &s,int re) { //定义判断栈是否为空的函数
if(s.top==-1)
return 1;//栈为空时返回值为1
else
return 0;//栈不为空时返回值为0
}
(4)判断是否匹配的算法。如果右括号,进栈,取下个字符;如果是左括号,出栈,取下个字符;最后判断栈是否为空。
通过本次实验,我对栈的使用更加熟练,入栈出栈的顺序也有了更一步的了解。
break;
case '}':
if(Pop(s)!='{')
return 0;
break;
case ']':
if(Pop(s)!='[')
return 0;
break;
}
}
int re=0; //定义并初始化判空函数的返回值
re=Empty(s,re); //返回判空函数的返回值
if(re==1)
return 1; //栈为空
s.top = -1;
}Hale Waihona Puke 3.算法设计(1)入栈的算法
char Push(stack &s, char a)
{ //入栈操作,将字符a入栈s
if(s.top == stacksize - 1) //当栈顶为栈的空间大小-1,栈满
return 0;
s.top ++;//入栈操作一次,栈顶+1
s.strstack[s.top] = a;//此时,栈顶元素为字符a
{//对输入的字符a进行判断
case '(':
case '{':
case '[':
Push(s,a);//若是左括号,则进行入栈操作
break;
//若是右括号,则进行出栈操作,若出栈元素不是与输入相对应的左括号,则字符串括号中不匹配,返回
case ')':
if(Pop(s)!='(')
return 0;
else
return 0; //栈不为空,有左括号,存在'('或'['或'{'未匹配
}
4.运行与测试
①输入1+(2+3).
②输入1+(2+3))
③输入1+((2+3)
④输入1+2+3+4
⑤输入1+[2+(4-2])*2
5.调试记录及收获
在运行程序时,当输入1+((2+3)时,因为错把’(’写成’(’,也就是输入法的中英文没有切换,所以得到的结果是错的。这就说明输入时要注意中英文。
相关文档
最新文档