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

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

课程名称:数据结构实验项目:括号匹配题目:括号匹配一、需求分析1、实验目标编一程序,检验括号是否匹配,体现栈结构的先进后出的固有特性。
2、程序的输入和输出输入: void push(char x) {stack[top++] = x;}输出:char pop() {if (top > 0)return stack[--top] ;elsereturn EMPTY;}两列间制表符隔开。
3、实验的目的:掌握栈后进先出的特性,读懂该程序的,掌握栈的基本操作;二、概要设计1、数据结构括号匹配的检验。
主要的操作:补充程序,检验括号是否匹配;2、程序的模块有个模块:#include <cstdlib>#include <iostream>using namespace std;#define EMPTY ' '//创建一个空栈char stack[32];int top = 0;//进栈void push(char x) {stack[top++] = x;}//出栈三、详细设计1、数据结构#include <cstdlib>#include <iostream>using namespace std;#define EMPTY ' '//创建一个空栈char stack[32];int top = 0;//进栈void push(char x) {stack[top++] = x;}//出栈char pop() {if (top > 0)return stack[--top] ;elsereturn EMPTY;}//括号匹配int main() {char s[256], x;int i;cin.getline(s, 256);for (i = 0; i < strlen(s); i++) { switch(s[i]) {case '{': //进栈case '[': //进栈case '(': //进栈push(s[i]); break;case '}':x = pop();if (x != '{') {cout << "not match\n" ; system("PAUSE");return -1; //出栈,判断是否为‘}’}case ']': //进栈x = pop();if (x != '[') {cout << " not match\n" ;system("PAUSE");return -1; //出栈,判断是否为‘]’}case ')': //进栈x = pop();if (x != '(') {cout << "not match\n" ;system("PAUSE");return -1; //出栈,判断是否为‘(’}}}if (top > 0)cout <<"not match\n";system("PAUSE");return 0;}2、文件预处理:补充程序的完整性,添加x = pop(); if (x != '('){ cout << "not match\n" ; system("PAUSE"); return -1;语句并作相应的修改四、调试五、测试结果输入([{ ) } ] )]} ( [ {输出Not match Not match Not match Not match。
数据结构试验8括号匹配

问题描述:编写一程序判断从键盘输入的子符串括号是否匹配。
假设需判断的括号只有“(”,“)”,“[”,“]”四种。
#include <stdio.h>#include <malloc.h>#define OK 1#define ERROR 0//定义顺序堆栈#define STACK_SIZE 100 //存储空间初始分配量#define STACK_INC 10 //存储空间分配增量/*typedef char Elem;*/typedef struct{char *base; //栈底指针char *top; //栈顶指针int size; //当前已分配的存储空间}SqStack;/*typedef int Status;*///创建空堆栈,栈顶指针和栈底指针相等时,栈为空int CreatStack(SqStack &S){S.base=(char *)malloc(STACK_SIZE*sizeof(char));S.top=S.base;S.size=STACK_SIZE;return OK;}//堆栈是否为空int StackEmpty(SqStack S){if(S.top!=S.base) return ERROR;return OK;}//进栈int Push(SqStack &S,char e){if(S.top-S.base>=S.size){ //栈满,追加存储空间S.base=(char *)realloc(S.base,(S.size+STACK_INC)*sizeof(char));S.top=S.base+S.size;S.size+=STACK_INC;}*S.top=e;S.top+=1;return OK;}//出栈int Pop(SqStack &S,char &e){if(S.top==S.base) return ERROR;S.top-=1;e=*S.top;return OK;}//括号匹配int Bracket(SqStack &S,char *str){int i=0,flag1=0,flag2;char e;while(str[i]!='\0'){switch(str[i]){case '(':Push(S,'(');break; //'('进栈case '[':Push(S,'[');break; //'['进栈case ')':{Pop(S,e);if(e!='(') flag1=1; break;} //出栈,判断是否为'(' case ']':{Pop(S,e);if(e!='[') flag1=1;break;} //出栈,判断是否为'[' default: break;}if(flag1) break; //出现不匹配,立即结束循环i++;}flag2=StackEmpty(S); //flag2判断堆栈是否为空if(!flag1 && flag2) printf("括号匹配!\n");else printf("括号不匹配!\n");return OK;}//主函数void main(){char temp,flag='y';while(flag=='y'){char str[255];SqStack S;printf("请输入字符串:");scanf("%s",str);scanf("%c",&temp); //接受输入的回车键CreatStack(S);Bracket(S,str);printf("你想再试一次吗(按y继续): ");scanf("%c",&flag);printf("\n");}printf("程序结束.\n");}。
数据结构 课程设计 括号匹配

华北科技学院课程设计说明书(数据结构课程设计)班级: 软件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数据结构本程序采用栈储存来存储读入的表达式中的括号,可以分为四部分,分别是:结构体定义,构造空栈,构造三个子函数,实现判断功能。
数据结构-括号排序

.
8
A×[ (B-C) + (D-E) ] / (F + G)
2
1
pos = 0
0
(
pos = 1
.
9
A×[ (B-C) + (D-E) ] / (F + G)
3
2
pos = 0 1
(
pos = 1
.
10
总结
• 括号匹配处理中,将左括号依次存入数组, 每次存进去的左括号都是在数组的最上部, 一旦遇到左右括号匹配,将数组最上部的 左括号移走;
计算表达式括号匹配问题
假定表达式中只包含两种括号[ ]、(), 例如表达式:A×[ (B-C) + (D-E) ] / (F + G)
.
1
A×[ (B-C) + (D-E) ] / (F + G)
2 1 0
pos = 1
解题思路:
借助于数组顺序处理表达式 中的每个括号,遇到左括号依 次存入数组,遇到右括号,则 与数组最上部的左括号匹配, 如果发现括号匹配错误,则终 止检测过程。如果匹配成功, 则将顶部的左括号移走。继续 往下…,一直到最后一个括号
.
2
A×[ (B-C) + (D-E) ] / (F + G)
2
2
1
1
0
pos =
0
0
[
pos = 1
.
3
A×[ (B-C) + (D-E) ] / (F + G)
2
pos = 1
1
(
pos = 0
0
[
.
4
A×[ (B-C) + (D-E) ] / (F + G)
数据结构括号匹配问题

1.问题描述假设一个算法表达式中包括圆括号,方括号两种,设计判别表达式中括号是否正确匹配的算法。
2.数据结构设计//定义一个栈类如下:template<class T>class stack{private:T* base;int top;int stacksize; //最大元素个数public:stack(int m);~stack(){delete []base;top=0;stacksize=0;}void push(T x);T pop();T gettop();int isempty();void clearstack();void stacktop();void stacktranverse();};3.算法设计//栈的创建template<class T>stack<T>::stack(int m){base=new T[m];if(base==NULL){cout<<"创建失败!"<<endl;}stacksize=m;top=-1;}//入栈算法template<class T>void stack<T>::push(T x){if(top==stacksize-1)cout<<"栈满,无法入栈";top++;base[top]=x;}//出栈算法template<class T>T stack<T>::pop(){T x;if(top==-1) cout<<"栈空,无法出栈";x=base[top--];return x;}//取栈顶元素template<class T>T stack<T>::gettop(){if(top==-1)cout<<"栈空,栈顶无元素";return base[top];}//判断栈是否为空template<class T>int stack<T>::isempty(){if(top==-1)return 0;elsereturn 1;}//遍历栈元素template<class T>void stack<T>::stacktranverse(){int i=top;while(i>=0)cout<<base[i--]<<'\t';cout<<endl;}4.运行与测试5.调试记录与收获通过调试,我发现程序有许多不足,经过修改才能更好地实现一些功能。
数据结构实验 表达式括号匹配配对判断问题.

实验表达式括号匹配配对判断问题姓名:班级:学号:实验时间:1.问题描述一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。
写一程序,判断任一算术表达式中所含括号是否正确配对。
2.数据结构设计匹配判别发生在右括号出现时,且被匹配的左括号应是距离右括号最近被输入的,二不是最先被输入的括号,即“先入后匹配”。
因此用栈来解决。
#define stacksize 100 //定义栈的空间大小structstack{ //定义栈的结构体char strstack[stacksize];//定义栈的存储格式为字符型 int top; //定义栈的栈顶变量};void InitStack(stack &s){//定义一个新栈s,初始化栈顶为-1s.top = -1;}3.算法设计(1)入栈的算法char Push(stack &s, char a){ //入栈操作,将字符a入栈sif(s.top == stacksize - 1) //当栈顶为栈的空间大小-1,栈满 return 0;s.top ++;//入栈操作一次,栈顶+1s.strstack[s.top] = a;//此时,栈顶元素为字符areturn 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;}(3)判断栈是否为空的函数int Empty(stack &s,int re){ //定义判断栈是否为空的函数if(s.top==-1)return 1;//栈为空时返回值为1elsereturn 0;//栈不为空时返回值为0}(4)判断是否匹配的算法。
如果右括号,进栈,取下个字符;如果是左括号,出栈,取下个字符;最后判断栈是否为空。
数据结构-括号匹配课程设计报告

算术表达式中括号不匹配。
四、 运行环境:
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)为了实现上述程序功能,需要:[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");}。
表达式的括号匹配检验问题课程设计报告

合肥学院计算机科学与技术系课程设计报告2008~2009学年第二学期2009年5月题目:表达式的括号匹配检验问题。
试验完成如下要求:假设在表达式中允许有三种括号:圆括号、方括号和花括号,其嵌套的顺序是随意。
要求设计测试数据,如果在表达式中括号使用正确,输出结果为“此表达式中括号匹配合法”,否则输出结果为“此表达式中括号匹配不合法”,#为表达式的起始和结束标志。
在初始和结束时,栈为空。
一、问题分析和任务定义此程序需要完成如下要求:表达式中允许有三种括号:圆括号、方括号和花括号,嵌套顺序随意。
要求设计测试数据,判断表达式中括号使用是否正确,如果正确,输出结果为“此表达式中括号匹配合法”,否则输出结果为“此表达式中括号匹配不合法”,表达式的输出格式为:“#表达式#”。
实现本程序需要解决的几个问题:1、用什么数据结构。
2、怎样实现判断括号是匹配的。
3、括号匹配与不匹配有几种情况。
4、输出与输入数据的形式。
本程序的难点在于怎么样判断括号是否匹配。
按任务书中的提示,首先,建立一个栈,用来存储读入的括号。
若是左括号,则做为一个新的更急迫的期待压入栈,若是右括号,则和当前栈顶的括号比较,若匹配,则输出此表达式中括号匹配合法,若不匹配,则输出此表达式中括号匹配不合法。
括号分为大括号,小括号,中括号,每个括号比较的方法是一样的。
如输入为#(3+2)#:输入#,输入(,“输入3+2,输入“)”,是右括,是左括号,入栈号“(”出栈,与“)”比较,匹配,栈空图1 具体实例演示括号匹配过程由于本程序要求表达式的输入形式是#表达式#,#是表达式的起始与结束的标志,所以判断表达式遍历完的条件是读到第二个#号。
总的来说本题目是一个以栈为数据结构,设计一个求有关于表达式中括号匹配的问题的程序。
数据类型应为字符型,需要自定义栈的结构体,初始栈,入栈,出栈,判断栈空的操作。
本程序用的是顺序栈,用地址连续的存储空间依次存储栈中的元素,并记录当前栈顶数据元素的位置,这样的栈称为顺序栈。
括号匹配的课程设计

括号匹配的课程设计一、教学目标本节课的学习目标主要包括以下三个方面:1.知识目标:学生需要掌握括号匹配的基本概念和原理,了解括号在编程中的应用和重要性。
2.技能目标:学生能够运用括号匹配的知识,解决实际编程问题,提高编程逻辑思维和解决问题的能力。
3.情感态度价值观目标:学生通过学习括号匹配,培养对编程的兴趣和热情,增强自主学习和探索的精神,提高团队合作和沟通的能力。
二、教学内容本节课的教学内容主要包括以下几个部分:1.括号匹配的基本概念和原理:介绍括号匹配的定义、作用和重要性。
2.括号在编程中的应用:讲解括号在编程中的具体应用,如条件语句、循环语句等。
3.括号匹配的算法实现:引导学生通过编程实践,掌握括号匹配的算法实现和优化。
4.编程实例分析:分析实际的编程实例,让学生了解括号匹配在解决实际问题中的应用。
三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用以下几种教学方法:1.讲授法:讲解括号匹配的基本概念和原理,让学生掌握括号匹配的基础知识。
2.讨论法:学生进行小组讨论,分享括号匹配在编程中的应用实例和心得体会。
3.案例分析法:分析实际的编程实例,让学生了解括号匹配在解决实际问题中的应用。
4.实验法:引导学生进行编程实践,让学生通过实际操作掌握括号匹配的算法实现和优化。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选用权威、实用的编程教材,为学生提供系统、全面的学习材料。
2.参考书:提供相关的编程参考书籍,方便学生课后自主学习和拓展。
3.多媒体资料:制作精美的PPT、教学视频等多媒体资料,提高学生的学习兴趣和效果。
4.实验设备:准备充足的编程实验设备,确保每个学生都能进行实际操作和练习。
五、教学评估为了全面反映学生的学习成果,本节课的教学评估将采用以下几种方式: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模块五:各模块间的调用关系首先创建一个堆栈并初始化,依次读入字符直到文件的末尾。
如果读得的字符为左括号,则将其压入堆栈。
数据结构实验报告:括号匹配问题

●实验内容:利用栈的基本操作,写一个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");。
数据结构括号匹配检验

《数据结构与算法》课程设计报告题目:括号匹配检验四.算法思想利用栈来判断括号是否匹配时,遇到左括号就进栈,遇到右括号则左括号出栈,代表这对括号匹配,如果右括号进栈时,栈为空,则说明缺少左括号,若表达式扫描完栈为空,则说明表达式的括号匹配,否则说明表达式缺少左括号。
五.算法设计程序流程图算法用到的抽象数据类型定义: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);}}/*取栈顶元素。
括号匹配的检查 课程设计 课程设计

衡阳师范学院《C语言数据结构》课程设计报告题目:括号匹配的检验班级: 1 1 0 1学号:1119011111901作者姓名:xxx xxx指导教师:xxx2012年11月目录1设计题目与要求 (3)1.1实验目的 (3)1.2问题描述 (3)1.3设计要求 (3)2总体设计思想及相关知识 (3)2.1总体设计思想 (3)2.2开发环境与工具 (4)3功能设计 (4)3.1 抽象数据类型的定义 (4)3.2 栈的基本运算 (4)3.3栈的基本操作的实现 (4)3.4模块流程图 (6)4源程序代码 (6)5测试及结果 (9)6总结 (11)7小组成员任务分配 (11)参考文献 (12)1.设计题目与要求1.1实验目的通过对括号匹配的检验的程序设计编写,深入了解和掌握栈的使用,了解栈先进后出的特点,掌握栈的表示和实现。
1.2问题描述假设表达式中允许包括两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(])或(()])均为不正确的格式。
检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。
例如考虑下列括号序列:[ ( [ ] [ ] ) ]1 2 3 4 5 6 7 8当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号只能暂时靠边,而迫切等待与第二个括号相匹配的,第七个括号的出现,类似的,因等来的第三个括号,其期待的匹配程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配成了当前最急迫的任务了,······,依次类推。
可见,这个处理过程恰与栈的特点相吻合。
1.3设计要求读入圆括号和方括号的任意序列,输出“匹配”或“此串括号匹配不合法”。
数据结构括号配对问题(栈)

实验报告课程名称:数据结构年级班级:计算机1712学号姓名:查玉坤 ********** 任课教师:***实验六、括号匹配算法的实现一、实验目的1)了解栈的存储结构及基本操作;2)了解队的存储结构与基本操作;3)了解栈和队的简单运用。
二、实验工具C-Free5三、实验练习和要求1、实验内容:1)分别建一个栈和队的结构;2)通过扫描,将含有大,中,小括号的测试字符串中的非括号字符过滤掉;3)利用栈来判断字符串中的大,中,小括号是否是匹配的。
实验要求:1)含有大,中,小括号的字符串测试用例要有多组(尽量包括各种情况);2、实验难点:1)如何判断某种括号的匹配性;2)如何判断是括号或是某种括号;3)栈和队的具体实现。
3、实现提示1)通过对字符是否属于串“()[]{}”来过滤是否是括号;2)利用括号的匹配的特点(第一个右与最后一个左来匹配)来进行匹配性判断,三种括号分别匹配;3)可利用括号在字符串“()[]{}”中的位置来进行匹配判断;4、注意事项测试用例要丰富(至少四组:不配/少左/少右/成功),返回结果要清楚。
5、在运行结果中加入自己的姓名学号和自己学位下一位同学的学号和姓名。
四、实验内容实验代码如下:#include<stdio.h>#include<stdlib.h>#define INITSIZE 100typedef char ElemType;typedef struct node{ElemType data;struct node *next;}slink;typedef struct{ int top;ElemType *base;int stacksize;}sqstack;//创建空链表slink *creslinkemp(){ slink *head,*p;p=head=(slink *)malloc(sizeof(slink));p->next=NULL;return head;}//输出链表void List(slink *head){ slink *p;p=head->next;while(p!=NULL){ printf(" %c",p->data);p=p->next;}printf("\n");}/*初始化操作(创建一个空栈S)*/void initstack(sqstack *S){ S->base=(ElemType *)malloc(INITSIZE*sizeof(ElemType)); S->top=0;S->stacksize=INITSIZE;}int gettop(sqstack *S,ElemType *e){ if(S->top==0) return 0;*e=S->base[S->top-1];return 1;}/*入栈操作(将值为x的数据元素插入到栈S中,使之成为栈顶元素)*/ int push(sqstack *S,ElemType x){ if(S->top>=S->stacksize){ S->base=(ElemType *)realloc(S->base,(S->stacksize+1)*sizeof(ElemType));if(!S->base) return 0;S->stacksize++;}S->base[S->top++]=x;return 1; }/*出栈操作(取出栈S的栈顶元素)*/int pop(sqstack *S,ElemType *e){ if(S->top==0) return 0;*e=S->base[--S->top];return 1;}/*判栈空操作(判断栈S是否为空)*/int emptystack(sqstack *S){ if(S->top==0) return 1;else return 0;}/*输出栈操作(输出自栈顶到栈底的元素值)*/void list(sqstack *S){ int i;for(i=S->top-1;i>=0;i--)printf("%c ",S->base[i]);}int strch(char KH[],char ch){for(int i=0;i<6;i++){if(KH[i]==ch) return 1;}return 0;}//判断左右括号int LORR(slink *p){if(p->data=='('||p->data=='['||p->data=='{') {return 1;}else return 0;}//返回配对的括号char match(char K){char R;switch(K){case '(':{R=')';break;}case '[':{R=']';break;}case '{':{R='}';break;}case ')':{R='(';break;}case ']':{R='[';break;}case '}':{R='{';break;}default:{break;}}return R;}int main(){char KH[7]="(){}[]";char ch,x;slink *KUOHAO=creslinkemp();slink *p=KUOHAO,*s;sqstack Lbracket;initstack(&Lbracket);printf("输入式子:\tCtrl+z结束输入\n");while(scanf("%c",&ch)!=EOF){if(strch(KH,ch)) {s=(slink *)malloc(sizeof(slink));s->data=ch;s->next=NULL;p->next=s;p=s;}}printf("\n所有括号为:");List(KUOHAO);printf("\n");p=KUOHAO->next;while(p!=NULL){if(LORR(p)){ //若为左括号,压栈push(&Lbracket,p->data);p=p->next;}else { //若为右括号gettop(&Lbracket,&x);if(emptystack(&Lbracket)) {printf("结果:缺少左括号%c\n\n",match(p->data));printf("查玉坤2017116128\n");printf("下一位同学:余晓敏2017117242\n");return 0;}else if(x==match(p->data)){pop(&Lbracket,&x);p=p->next;}else{printf("结果:括号种类不配对!\n\n");printf("查玉坤2017116128\n");printf("下一位同学:余晓敏2017117242\n");return 0;}}}gettop(&Lbracket,&x);if(!emptystack(&Lbracket)){printf("结果:缺少右括号%c\n\n",match(x));}else printf("结果:括号匹配正确!\n\n");printf("查玉坤2017116128\n");printf("下一位同学:余晓敏2017117242\n");return 0;}运行结果:例1: 例2:例3: 例4:五、疑难问题的解决和感想错误:由于while循环中套用了较多if条件句,使用括号较多,导致程序最后少了一个“}”。
数据结构括号匹配实验报告

括号的匹配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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计内容:括号匹配问题,假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中括号是否正确配对。
算法要求:要求当输入一表达式,可判断并输出括号是否匹配。
算法思想
在算术表达式中,右括号和左括号匹配的次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特点,因此可以借助一个堆栈来进行判断。
【2】朱战立.数据结构---使用C语言(第四版).电子工业出版社2009
【3】吴跃.数据结构和算法.机械工业出版社2010
发出任务书日期:2010年11月23日指导教师签名:
计划完成日期:2010年12月27日教学单位责任人签章:
1设计内容1
2算法思想描述1
3算法及程序实现2
4算法测试及结果4
5总结8
XX
学号
110109020XX
一、课程设计(论文)的内容
括号匹配问题,假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中括号是否正确配对。
二、课程设计(论文)的要求与数据
要求当输入一表达式,可判断并输出括号是否匹配。
三、课程设计(论文)应完成的工作
(1)根据上述要求完成一个功能完善的程序;
StackPop(&myStack,&c);
else if (exp[i]==']'&&StackNotEmpty(myStack)
&&StackTop(myStack,&c) && c!='{')
{
printf("左右括号配对次序不正确!\n");
return;
}//判断花括号
else if(((exp[i]==')')||(exp[i]==')')||(exp[i]=='}'))
{
DataType stack[MaxStackSize];
int top;
} SeqStack;
void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/
{
S->top = 0; /*定义初始栈顶下标值*/
}
int StackNotEmpty(SeqStack S)
/*判顺序堆栈S非空否,非空则返回1,否则返回0*/
return;
}// 判断方括号
else if (exp[i]=='}'&&StackNotEmpty(myStack)
&&StackTop(myStack,&c) && c=='{')
StackPop(&myStack,&c);
else if (exp[i]==']'&&StackNotEmpty(myStack)
printf("堆栈已空无数据元素出栈! \n");
return 0;
}
else
{
S->top --;
*d = S->stack[S->top];
return 1;
}
}
int StackTop(SeqStack S, DataType *d)
/*取顺序堆栈S的当前栈顶数据元素值到参数d,成功则返回1,否则返回0*/
1
算法以及程序实现
主函数设计如下:
Void ExpIsCorrect(char exp[],int n)//判断有n个字符的字符串exp左、右括号是否配对正确
{
SeqStack myStack;//定义顺序堆栈变量myStack
int i;
char c;
StackInitiate(&myStack); //初始化堆栈
&&StackTop(myStack,&c) && c=='(')
StackPop(&myStack,&c); //出栈
else if (exp[i]==')'&&StackNotEmpty(myStack)
&&StackTop(myStack,&c) && c!='(')
{
printf("左右括号配对次序不正确!\n");
广东工业大学华立学院
课 程 设计
课程名称数据结构
题目名称括号匹配
学生学院广东工业大学华立学院
专业班级09计算机2
学号11010902026
学生姓名李 杰
指导教师林荣霞
2010年12月27日
广东工业大学华立学院
课程设计(论文)任务书
题目名称
括号匹配
学生学部(系)
信息与计算机学部
专业班级
09计算机2班
姓名
&&StackTop(myStack,&c) && c!='[')
{
printf("左右括号配对次序不正确!\n");
return;
}// 判断方括号
else if (exp[i]=='}'&&StackNotEmpty(myStack)
&&StackTop(myStack,&c) && c=='{')
typedef char DataType;
#include"SeqStack.h"
Void ExpIsCorrect(char exp[],int n)//判断有n个字符的字符串exp左、右括号是否配对正确
{
SeqStack myStack;//定义顺序堆栈变量myStack
int i;
char c;
(2)采用模块化的程序设计方法,程序书写符合规范,程序设计应完善;
(3)对系统进行初步的错误和漏洞检测;
(4)根据设计规范撰写报告并按时提交;
(5)设计内容用A4纸打印并按要求装订。
四、课程设计(论文)进程安排
序号
设计(论文)各阶段内容
地点
起止日期
1
搜集资料
图书馆
11.24-11.26
2
需求分析
图书馆
{
if(S.top <= 0) return 0;
else return 1;
}
int StackPush(SeqStack *S, DataType x)
/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */
{
if(S->top >= MaxStackSize)
{
printf("堆栈已满无法插入! \n");
{
if(S.top <= 0)
{
printf("堆栈已空! \n");
return 0;
}
else
{
*d = S.stack[S.top - 1];
return 1;
}
}
测试函数如下:
#include<string.h>
#include<stdio.h>
#define MaxStackSize 100
左右括号匹配正确!
7
总结
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。
char a[]= "(())abc{[]()}";//测试例子1
char b[]= "(()))abc{[]}";//测试例子2
char c[]= "(()()abc{[]}";//测试例子3
char d[]= "(())abc{[]}";//测试例子4
int n1 =strlen (a) ;
int n2 =strlen (b) ;
{
printf("右括号多于左括号!\n");
return;
}
}
if(StackNotEmpty(myStack))
printf("左括号多于右括号!\n");
else
printf("左右括号匹配正确!\n");}ຫໍສະໝຸດ 3算法测试以及测试结果
函数头文件(SeqStack.h):
typedef struct
for(i=0;i<n,i++)
{
if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{') )
StackPush(&myStack,exp[i]); //入栈
else if (exp[i]==')'&&StackNotEmpty(myStack)
&&StackTop(myStack,&c) && c=='(')
StackInitiate(&myStack); //初始化堆栈
for(i=0;i<n,i++)