括号匹配实验报告
括号匹配实验报告书

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. 栈是一种后进先出(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. 编写主函数。
数据结构中关于括号匹配问题的算法

《数据结构》实验报告二实验内容:括号匹配学号:姓名:一、上机实验的问题和要求(需求分析):[ 题目] 假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])] 等为正确格式,[(])或(((]均为不正确的格式。
读入含圆括号和方括号的符号序列,输出“匹配”或“此串括号匹配不合法”。
二、程序设计的基本思想,原理和算法描述:本程序是在实现栈的基本操作的基础上实现其基本应用,即括号匹配问题,重点利用其“先进后出”的特性三、调试和运行程序过程中产生的问题及采取的措施:(略)四、源程序及注释[ 源程序] 程序名: 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(表明括号不匹配)。
括号匹配的报告

实验题目括号匹配实验报告一、实验目的与要求利用链栈实现括号匹配算法;要求:运用链表建立一个栈S。
检验括号是否匹配的方法可用“期待的急迫程度”来描述。
每读入一个括号,若是右括号,则或者使置于栈顶的最急迫的期待得以消解,或者是不合法的情况;若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性都降了一级。
另外,在算法的开始和结束时,栈都应该是空的。
二、实验方案算法思想:利用栈的后进先出性质,编写的括号({[]})匹配算法,如果是{([])}形式的括号,显示匹配,如果是(}])[则显示不匹配,基本思想:1.遇到左括弧,则进栈,2.遇到右括弧,则和栈顶的括弧检验是否匹配,如果匹配,则将左括弧出栈3.全部匹配时,栈应该是空#define NULL 0typedef struct LNode{char data;char *next;char *top; /*栈顶指针*/}LNode,*LinkStack;int Init(LinkStack S) /*置栈空*/{ S=(LinkStack)malloc(sizeof(LNode));S->top=NULL;}int StackEmpty(LinkStack S) /* 判栈空*/{ if(S->top==0)return(1);elsereturn(0);}int Push(LinkStack S,char e) /*进栈Push*/{ char *p=(LinkStack)malloc(sizeof(LNode));; /*申请一个结点空间*/p->data=e;p->next=S->top;S->top=p;return 1;}Int Pop(LinkStack S,char e){char *p=(LinkStack)malloc(sizeof(LNode));;if(S->top!=NULL){p->data=e;p=S->top;S->top=p->next;free(p);}return 1;}int Top(LinkStack S) /*取栈顶元素*/{char e;if(StackEmpty(S)) return 0;else { e=S->top;return 1; }}int Brackets(LinkStack S,char *str){int i=0,X=0;char e;printf("Please input string:\n");scanf("%s",str);while(str[i]!='\0'){switch(str[i]){case '(':push(S,str[i]);break;case '[':push(S,str[i]);break;case '{':push(S,str[i]);break;case ')':{pop(S,&e);if(e!='(')X=1;}break;case ']':{pop(S,&e);if(e!='[')X=1;}break;case '}':{pop(S,&e);if(e!='{')X=1;}break; default:break;}if(X)break;i++;}if(!X&&stackempty(S))printf("You are right!the brackets is match!\n");elseprintf("Wrong!!the brackets isn't match!\n");return 1;}#include<stdio.h>void main(){ char str[100];LinkStack S;Init(S);printf("-----------------------------------\n");printf(" WELCOME \n") ; printf("-----------------------------------\n") ;Brackets(S,str);printf("\n\n\n");printf(" See you \n"); getch();}三、实验结果和数据处理四、结论本次实验过程中主要遇到的问题有以下几点:1.说明语法错误,通常是定义的时候重复定义或者不符合c语言的表现类型的定义。
编写一个括号匹配的检验的程序实习报告

编写一个括号匹配的检验的程序实习报告在计算机科学领域,括号匹配是一个常见的问题。
括号匹配指的是在一个字符串中,所有的括号都必须正确地成对出现。
如果所有的括号都能正确地匹配,那么该字符串是合法的;否则,该字符串是非法的。
在本次程序实习中,我设计并实现了一个括号匹配的检验程序。
首先,我对括号匹配的问题进行了深入的研究和分析。
我发现,括号匹配问题可以通过使用栈来解决。
栈是一种遵循后进先出原则的数据结构,在括号匹配问题中非常适用。
我使用了一个栈来存储左括号,并在遍历字符串时进行匹配操作。
接下来,我实现了一个简单而高效的括号匹配检验程序。
该程序可以接收一个字符串作为输入,并判断该字符串中的括号是否匹配。
我使用了编程语言(例如C++或Python)来实现该程序,具体的实现细节如下:1. 首先,我创建了一个空栈,用来存储左括号。
2. 然后,我遍历输入的字符串,逐个检查每个字符。
3. 如果当前字符是左括号(例如'('、'{'或'['),则将其推入栈中。
4. 如果当前字符是右括号(例如')'、'}'或']'),则检查栈是否为空。
如果栈为空,则字符串中的右括号没有相应的左括号,该字符串是非法的;如果栈不为空,则将栈顶的左括号弹出并与当前的右括号进行匹配。
如果两个括号不匹配,那么该字符串是非法的。
5. 最后,当遍历完整个字符串后,检查栈是否为空。
如果栈为空,则说明所有的左括号都有相应的右括号,该字符串是合法的;如果栈不为空,则说明字符串中存在未匹配的左括号,该字符串是非法的。
通过实现这个括号匹配的检验程序,我学到了许多关于栈的知识和算法设计的技巧。
此外,我也加深了对括号匹配问题的理解和掌握。
通过编写和调试这个程序,我提高了自己的编程能力和解决问题的能力。
总的来说,本次括号匹配的检验程序实习让我深入了解了括号匹配问题,并通过实际动手编写代码来解决这个问题。
括号配对问题实验报告(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.需求分析本演示程序用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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告课程名称:数据结构班级:实验成绩:实验名称:栈、队列、字符串和数组学号:批阅教师签字:实验编号:实验二姓名:实验日期:指导教师:组号:实验时间:一、实验目的(1)掌握栈、队列、串和数组的抽象数据类型的特征。
(2)掌握栈、队列、串和数组的抽象数据类型在计算机中的实现方法。
(3)学会使用栈、队列来解决一些实际的应用问题。
二、实验内容与实验步骤(1)实验内容:假设表达式中除了变量名、常量和运算符外,还可以允许两种括号:圆括号和中括号,其嵌套的次序随意,编写程序检验输入的表达式中括号的的顺序是否合法。
(2)描述抽象数据类型或设计的函数描述,说明为什么要使用这种抽象数据类型,并说明解决设想。
抽象数据类型或函数描述:首先定义了一个结构体并且声明为栈类型,在其中定义了空间基地址的指针、栈顶指针以及栈存储空间的大小。
之后设计了Creat _Stack的函数,用此函数来创建一个空栈,这样可以使用堆栈来实现括号匹配的功能,又设计了一个名为Stack_Full的函数了来判断栈是否已满,若栈未满才可继续之后的压栈功能,如果堆栈已满,则需要使用realloc来动态分配空间,扩大栈的存储空间。
我还设计了一个名为empty的函数,用它来判断堆栈是否为空,堆栈为空或不为空时分别返回0或1。
之后设计了名为push和pop的函数来实现括号的入栈和出栈,之后设计了名为Match的函数,来判断括号是否匹配,设计了名为clean的函数来清空堆栈,这样可以连续判断不同的多项式的括号是否匹配。
解决设想:对于本题,首先我使用了栈结构,利用栈中数据“先进后出”的特点来实现对括号是否匹配的检验。
实现过程基本如下:从左到右依次扫描多项式,如果遇到左括号便将左括号入栈,在所有左括号入栈之后便可以扫描到右括号,如果扫描到的右括号和栈顶的左括号可以匹配时,将左括号出栈,以此类推,最后判断栈是否为空,若为空,则括号匹配,否则括号不匹配。
三、实验环境操作系统:Windows 7调试软件名称:VC++版本号:6.0上机地点:综合楼311四、实验过程与分析(1)实现时,主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
主要函数或操作内部的主要算法:typedef struct//栈的声明{char *base;//指示存储数据元素的空间基地址的指针char *top;//栈顶指针int stacksize;//栈存储空间大小,以数据元素为单位}SStack;void Creat_Stack(SStack *s)//创建空栈{s->base=(char*)malloc(sizeof(char)*size);if(s->base==NULL)printf("error\n");else{s->top=s->base;s->stacksize=size;}}上面的算法用来建立栈,该算法的时间复杂度为O(1),空间复杂度为O(n)。
int Stack_Full(SStack *s)//判断栈是否为满{if(s->top-s->base>=100)return 1;elsereturn 0;}int empty(SStack *s)//判断栈是否为空{if(s->base==s->top)return 0;elsereturn 1;}上面的算法分别用来判断栈是否已满,栈是否为空栈,上面两个算法的时间复杂度和空间复杂度均为O(1)。
void push(SStack *s,char *str)//入栈{if(Stack_Full(s)!=0){printf("full\n");}else*s->top++=*str;}void pop(SStack *s,char *str)//出栈{if(s->base==s->top)printf("The stack is empty\n");else*str=*--s->top;}上面两个算法用来实现数据的入栈和出栈,时空复杂度均为O(1)。
void Match(SStack *s,char *str){int i,j;char t;j=strlen(str);for(i=0;i<j;i++){if(str[i]=='('||str[i]=='[')push(s,str);}for(i=0;i<j;i++){if(str[i]==')'){if(*s->top=='('){pop(s,&t);}elses->top=s->top-1;}if(str[i]==']'){if(*s->top=='['){pop(s,&t);}elses->top=s->top-1;}}if(empty(s)==0)printf("括号匹配!\n");elseprintf("括号不匹配!\n");}该Match函数的作用即判断括号是否匹配,是本程序的核心函数,若假设输入的表达式的长度为n,则此函数中进行了两次循环,一次为扫描左括号使其全部入栈,另外一次为扫描右括号并且判断新扫描出来的右括号与栈顶的左括号是否匹配。
在整个过程中执行了2n次循环,因此此程序的时间复杂度为O(n)。
对于空间复杂度,本算法存储了长度为n的表达式,因而该算法的空间复杂度为O(n)。
设计的巧妙之处:在本程序中我使用了栈这种抽象数据类型,栈的“先进后出”的特点与检验括号是否匹配的“期限待的急迫程度相吻合,设计顺序栈来解决括号匹配问题。
如果单从括号检验这个目的考虑可以有多种方法来实现该实验目的,而使用栈来实现括号匹配的检测,简化了程序的设计,比较容易理解和实现,并且可以提高时间效率。
(2)你在调试过程中发现了怎样的问题?又做了怎样的改进?1)在开始程序编译时,编译器总是提醒函数的形式参数的写法有问题,之后我发现,我在栈声明时将SStack未声明为指针类型,而我在形式参数中将参数写成了SStack s,因而出现错误,所以我将其更改为SStack *s,这个问题得以解决。
2)之后,编译器进行编译时,编译器提醒我在调用empty,match等函数时,实际参数的输入有问题,使得编译不能够通过,经过检查我发现我在写这些函数时,形式参数定义为char *s,因而我便在实际参数中代表字符串的参数前加取地址&符号,这个问题便解决了。
3)在进行编译时还出现了这样的警告,说我的小于号没有定义或者没有匹配,经过检查我发现我在循环中将其中一个条件写成<strlen(str),之后,我定义了一个新的局部变量j,用j等于str的长度,这样警告便消除了。
(3)你的抽象数据类型的实现是否具有可扩展性?我的抽象数据类型具有可扩展性,因为栈的大小可以修改,如果栈已满,则可以增加空间,因此具有可扩展性。
(4)测试结果五、实验结果总结回答以下问题:(1)你的测试充分吗?为什么?你是怎样考虑的?答:我认为我的测试充分,因为我的表达式是随机给出的,这样选择的数据具有随机性,具有很强的代表性,并且每次的结果正确,因此我认为我的测试比较充分。
(2)为什么你要选用栈或队列或字符串或数组等抽象数据类型作为你应用的数据结构?答:我使用了栈这种抽象数据类型作为我应用的数据结构,栈是一个只能访问表的尾端数据的数据集合,是一种在表的一端进行插入和删除操作的线性表,数据具有“先进后出”的特点,而这种特点和括号匹配中检验括号的“期限待的极限程度”这个特点相符合,因此选用栈这种数据结构可以简化程序,更好的理解和实现程序,提高了程序运行的时间效率。
(3)用一段简短的代码及说明论述你的应用中主要的函数的主要处理部分。
答:下面的代码部分为Match函数中的主要处理部分,使用了两个循环来处理输入的表达式,第一个循环是用来从左到右扫描表达式遇到“(”或者“[”就将括号入栈,第二个循环是用来扫描表达式,如果遇到“)”或“]”就将其与栈顶的括号进行匹配,如果匹配,就将栈顶的左括号弹出,如果不匹配就将栈顶指针向下移动,直到所有的括号操作完成,如果栈为空,那么该表达式的括号是匹配的,否则括号不匹配。
j=strlen(str);for(i=0;i<j;i++){if(str[i]=='('||str[i]=='[')push(s,str);}for(i=0;i<j;i++){if(str[i]==')'){if(*s->top=='('){pop(s,&t);}elses->top=s->top-1;}if(str[i]==']'){if(*s->top=='['){pop(s,&t);}elses->top=s->top-1;}}(4)你的应用中采用的是顺序的还是链式的存储结构?为什么要选用这种存储结构。
答:我的应用中采用的是顺序的链式存储结构,因为对于栈这种抽象的数据类型,有着“先进后出”的特点,这种特性和表达式中括号匹配的过程相符合,因此我采用了这种存储结构。
(5)源程序的大致的执行过程是怎样的?答:先用编译器编写一个.c的文件,然后编译生成.obj的文件,通过连接将目标文件连接生成一个.exe文件,之后运行文件就可以执行了。
六、附录(1)如果你对这个实验还有其他的解决方案或设想,或对我们的实验方案有什么意见,请在此描述。
这次实验提高了我对数据结构中堆栈、队列的理解,提高了我的编程能力,学校以后可以增加实验课的课时,这样我们可以更大程度的提高自己的编程能力。
另外对于本实验,我觉得我们还可以使用链表完成,链表中每个结点存储的数据项内容为括号,从左导游扫描表达式,将所有的括号按照扫描的顺序存成链表这种数据结构之后,可以将第一个结点的内容和最后一个结点的内容比较,如果匹配则比较第二个和倒数第二个,以此类推。
否则输出括号不匹配。
(2)实验参考的资料《数据结构(第二版)》闫玉宝编著清华大学出版社思考题(a)栈和队列在计算机系统中有哪些应用?写出你知道的系统中,这两种抽象数据类型的应用。
答:在计算机系统中,使用栈的应用有表达式的计算,迷宫以及括号匹配等。
使用队列的应用有打印文档,售票系统,解决主机与外部设备之间速度不匹配问题,解决多用户引起的资源竞争问题等(b)在程序调用的时侯,需要进行函数的切换,你认为函数在进行切换时系统要做那些工作?答:对于函数的切换,主要是一个压栈的过程,先以一种约定的方式把参数压栈,然后根据函数地址调用函数,函数执行后根据约定的方式出栈取得参数。