括号匹配问题

括号匹配问题
括号匹配问题

实验报士

号匹配问

一、实验目的:

1、熟练掌握数据结构基本知识;

2、通过括号匹配的实验,了解栈的表示和栈的基本操作,掌握栈“后进先出”的特性并能够应用这一特性。

二、实验工具:C-Free

三、实验内容:

设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ([( }]) 或({([][ ( ) ] ) } )等均为正确格式,而({[] )、{[()] 或([]} 等均

不正确。在算法中可设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配将栈顶的左括号出栈,否则属于不合法情况。另外,如果输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类型的左括号,均属不合法情况。当输入序列和栈同时为空时,说明所有括号完全匹配。

四、实验过程:

#include

#include

#define STACKINCREAMENT 10

#define STACK_INIT_SIZE 100

#define OVERFLOW -2

#define OK 1

#define ERROR 0

typedef int status;

typedef char SElemtype;

typedef struct

{

SElemtype *base;

SElemtype *top;

status stacksize;

}sqstack;

status Init(sqstack *s)

{

s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));

if(!s->base)

exit(OVERFLOW);

s->top = s->base;

s->stacksize = STACK_INIT_SIZE ;

return OK;

}

status push(sqstack *s, SElemtype e)

{

if(s->top - s->base >= s->stacksize)

(

s->base=(SElemtype*)realloc(s->base,(s->stacksize+STACKINCREAMENT)*sizeof(SElemtype)) if(!s->base)

exit(OVERFLOW);

s->top = s->base + s->stacksize;

s->stacksize += STACKINCREAMENT;

}

*s->top++ = e;

return OK;

}

status pop(sqstack *s, SElemtype *e)

(

if(s->top == s->base)

return ERROR;

*e=*--s->top;

return OK;

}

status stackempty(sqstack *s)

(

if(s->top==s->base)

return OK;

return ERROR;

}

status Parenthesis_match(sqstack *s,char *str)

(

int i=0, flag=0;

SElemtype e;

while(str[i] != '\0')

(

switch(str[i])

(

case '(':

push(s,str[i]);

break;

case '[':

push(s,str[i]);

break;

case ')':

(

pop(s,&e);

if(e != '(') flag=1;

}

break;

(

pop(s,&e);

if(e!='[') flag=1;

}

break;

default:

break;

}

if(flag)

break;

i++;

}

if(!flag && stackempty(s))

printf("括号匹配成功!\n");

else

printf("括号匹配失败!\n");

return OK;

}

int main()

(

char str[100], enter;

sqstack s;

Init(&s);

printf("请输入字符串:\n");

scanf("%s”,str);

scanf("%c”,&enter);

Parenthesis_match(&s,str);

return 0;

}

实验结果:

B ■C:\IJ,Epr5\^\1fiippD5ita\Roaming\C-Frf i p\5.D\tampliP a;1\projf t rt^\dialog\^^^K6,p5fp" —□ X (({ UM 1))

括号匹配失败!

信按任意槌继税. .

数据结构课程设计---括号匹配

目录 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 10

char *base; char *top; int stacksize; }SqStack; 2.2主要算法设计 2.2.1算法思想 (1)文字描述 从键盘输入一个表达式; 逐个扫描表达式中的字符; 当遇到左括号时,将左括号入栈; 继续扫描,将此后遇到的第一个右括号与栈顶元素比较,若匹配,则栈顶元素出栈;否则,继续扫描; 当整个表达式扫描完以后,判断栈内是否还有元素,若有,则括号不匹配; 若栈为空,则括号配对成功; 在括号配对不成功的情况下,利用栈顶栈底元素的差值,可以对左右括号数进行比较。(2)流程图表示

C++栈实现括号匹配

//本程序以经亲测,在VS2008中复制即可实现。 // Stack_made_by_zrz.cpp : 定义控制台应用程序的入口点。 //括号匹配问题。利用栈来解决一个字符串之中使用的括号是否匹配的问题。 /* 在表达式中,相同类型的括号(包括:()、[ ]、{})是成对出现的,并且当括号在表达式中嵌套时,不允许出现交叉现象。 检验括号匹配的方法,就是对给定的字符串依次检验:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配; 是其他字符,不检验。检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。 */ #include"stdafx.h" #include #include #include using namespace std; #define stacksize 100 //定义栈的空间大小 struct stack{ //定义栈的结构体 char strstack[stacksize];//定义栈的存储格式为字符型 int top; //定义栈的栈顶变量 }; void InitStack(stack &s){ //定义一个新栈s,初始化栈顶为-1 s.top = -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 return a; } char Pop(stack &s ){ //出栈操作 if (s.top == -1) //当栈顶为-1时,栈空 return 0; char a = s.strstack[s.top];//将栈顶元素赋予字符a,并返回字符a,完成出栈操作 s.top--; return a; } int Empty(stack &s,int re){ //定义判断栈是否为空的函数 if(s.top==-1) return 1;//栈为空时返回值为 else return 0;//栈不为空时返回值为 } int Check(char* str){ //检验括号是否匹配的函数 stack s;

用栈实现括号匹配的检验 修改

用栈实现括号匹配的检验修改(2008-11-14 19:06:31) 标签:c语言编程turbo c2.0环境实现栈括号匹配it 分类:C语言编程例子数据结构C 语言版 括号匹配问题是编译程序时经常遇到的问题,用以检测语法是否有错。 本文前些天写的用栈实现括号匹配的检验的代码中,其中用了更少变量的代码二有些错误,使得结果总是match,经过修改,现将正确的代码写出,如下 #include #include #define OVERFLOW -1 #define OK 1 #define ERROR 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define NULL 0 typedef char SElemType; typedef int Status; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack *S) { (*S).base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { free((*S).base); (*S).base=NULL; (*S).top=NULL;

括号匹配检验

括号匹配检验,是假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即( [ ] ( ) )或[ ( [ ] )]等为正确的格式,[ ( ] )或( [ ( ))或( ( ) ] )均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”概念来描述。整个处理过程与栈的特点相吻合。因此此程序利用链表的头插法特点来完成。 #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; }

利用顺序栈实现括号匹配 c语言

#include #include //malloc,realloc #include //含有overflow #include //exit() #define S_SIZE 100 //栈的空间大小 #define STACKINCREAMENT 10//增加空间 struct SqStack{ int *base; //栈底 int *top; //栈顶 int stacksize; //栈当前的存储空间 }; void main() {//子函数声明 void InitStack(SqStack &S);//初始化空栈 int StackEmpty(SqStack S);//判空 void push(SqStack &S,int e);//进栈 void pop(SqStack &S,int &e);//出栈 //主函数开始 SqStack s;//初始化空栈 InitStack(s); char ch[100],*p;int e; p=ch; printf("输一个含义有()[]{}的括号表达式:\n"); gets(ch); while(*p) { switch (*p) { case '{': case '[': case '(': push(s,*p++);break;//只要是左括号就入栈 case '}': case ']': case ')':pop(s,e); if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')')) p++; else {printf("括号不匹配!");exit(OVERFLOW);} break; default :p++;//其他字符就后移 } } if (StackEmpty(s)) printf("括号匹配成功");

括号匹配问题源代码(C语言)

括号匹配问题就是给定任意判别式,然后检验括号的配对出现的情况。 可见输入的表达式有四种可能性:右括号配对次序不正确、右括号多于左括号、左括号多于右括号、左右括号匹配正确。可以先检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。程序流程图如下:

程序代码如下: #include #include #include #include #define MaxSize 50 using namespace std; /*------------主要的数据结构类型 --------------*/ struct Text { int top; char Szstack[MaxSize]; }; /*-------------程序功能模块函数-------------*/ //检验栈是否为空 bool IsEmpty(Text G) { if(G.top==-1) return true; else return false; } //检验栈是否为满 bool IsFull(Text G) { if(G.top==MaxSize-1) return true; else return false; } //弹出栈顶元素 char Pop(Text G) { char n=G.Szstack[G.top]; return n; } //检验括号是否配对 int Check(char *A) { int i; Text G; G.top=-1; int L=strlen(A);

实验二 栈与队列操作实验题目

实验二栈与队列操作 实验目的: (1)理解栈与队列的结构特征和运算特征,以便在实际问题背景下灵活运用。 (2)了解复杂问题的递归算法设计。 本次实验中,下列实验项目选做一。 1、顺序栈的基本操作 [问题描述] 设计算法,实现顺序栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立顺序栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)将栈顶元素出栈。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 2、链栈的基本操作 [问题描述] 设计算法,实现链栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立带头结点的链栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)完成出栈操作。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 (7)输出链栈的长度。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 3、循环队列的基本操作 [问题描述] 设计算法,实现循环顺序队列的建立、入队、出队等操作。 [基本要求] (1)从键盘输入10个字符以$结束,建立循环队列,并显示结果。 (2)从键盘输入1个元素,执行入队操作,并显示结果。 (3)将队头元素出队,并显示结果。 (4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

4、只用尾指针表示的循环链表队列的综合操作 [问题描述] 假设以带头结点的的循环链表表示队列,并且只设一个指针指向队尾元素的结点(注意不设头指针),试编写队列初始化、入队、出队函数。 [基本要求及提示] (1)首先定义链表结点类型。 (2)编写带头结点的循环链表的初始化函数,只用尾指针表示。 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.初始化;2.入队;3.出队;4.退出),调用上述功能函数。 5、用标志域表示队空队满状态的循环队列的综合操作 [问题描述] 要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。 [基本要求及提示] (1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front==Q->rear,满:(Q->rear+1)%MAXSIZE==Q->front。 (2)本题不损失一个空间全部都得到利用,为此如下定义循环队列类型: Typedef struct { QueueElementType element[MAXSIZE]; int front; int rear; int tag; }SeqQueue; 此时,循环队列空和满的条件分别为: Q->front==Q->rear&&tag==0 和 Q->front==Q->rear&&tag==1 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。 6、利用辅助数组进行栈的逆置 [问题描述] 利用辅助栈将栈中的元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。 7、利用辅助栈进行队列的逆置 [问题描述] 利用辅助栈进行队列元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入队;2.出队;3.逆置;4.退出)调试运行程序。 8、Hanoi塔问题

C语言之符号匹配

5):利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上述括号的表达式,检验括号是否配对。本题给出部分check()函数,要求将check()函数补充完整,并完成整个程序。 typedef char SElemType; #include"malloc.h" #include"stdio.h" #include"math.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等 #define STACK_INIT_SIZE 10 // 存储空间初始分配量 #define STACKINCREMENT 2 // 存储空间分配增量 struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }; // 顺序栈 Status InitStack(SqStack &S) { S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) { return ERROR; } S.top = S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status StackEmpty(SqStack S) { if(S.top == S.base) return TRUE; else return FALSE; } Status Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize)

数据结构课程设计---括号匹配

目录 1.1 题目.................................................... 2............... 1.2 问题.................................................... 2............... 2 设计...................................................... 2 ............... 2.1 存储结构设计............................................ 2 ............. 4 对设计和编码的讨论和分析................................. 2..1. 4.1 设计................................................... 2..1.. 4.2 对编码的讨论........................................... 2..1. 5 总结和体会.............................................. 2..3 ........... 附录一 ................................................... 2..4 ............. 本科生课程设计成绩评定表.......................................... 错...误... !未定义书签 1 问题描述 .................................................................................................... 2 ............. 1.3 要求......................................................................................................... 2 .............. 2.2 主要算法设计........................................................................................... 3 ........... 2.3 测试用例及测试结果............................................................................... 6 ......... 3 调试报告 .................................................................................................... 9 .............

括号匹配的检查 课程设计

衡阳师范学院 《C语言数据结构》 课 程 设 计 报 告 题目:括号匹配的检验 班级: 1 1 0 1 学号: 作者姓名: 指导教师: 2012年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设计要求 读入圆括号和方括号的任意序列,输出“匹配”或“此串括号匹配不合法”。2.总体设计思想及相关知识 2.1总体设计思想 最内层(最迟出现)的左括号必须与最内层(最早出现)的同类右括号匹配,它最期待着急迫的配对。配对之后,期待得以消除。因此为左括号设置一个栈,置于栈顶的左括号期待配对的急切程度最高。另外,在算法的开始和结束时,栈都应该是空的。例如:[()[]]、 ([{}]) 、{([]]}

括号匹配问题

实验报士 括 号匹配问 题

一、实验目的: 1、熟练掌握数据结构基本知识; 2、通过括号匹配的实验,了解栈的表示和栈的基本操作,掌握栈“后进先出”的特性并能够应用这一特性。 二、实验工具:C-Free 三、实验内容: 设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ([( }]) 或({([][ ( ) ] ) } )等均为正确格式,而({[] )、{[()] 或([]} 等均 不正确。在算法中可设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配将栈顶的左括号出栈,否则属于不合法情况。另外,如果输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类型的左括号,均属不合法情况。当输入序列和栈同时为空时,说明所有括号完全匹配。 四、实验过程: #include #include #define STACKINCREAMENT 10 #define STACK_INIT_SIZE 100 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int status; typedef char SElemtype; typedef struct { SElemtype *base; SElemtype *top; status stacksize; }sqstack; status Init(sqstack *s) { s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype)); if(!s->base) exit(OVERFLOW); s->top = s->base; s->stacksize = STACK_INIT_SIZE ; return OK; } status push(sqstack *s, SElemtype e) {

括号匹配(数据结构实验报告)

课程名称: 《数据结构》课程设计课程设计题目: 括号匹配 姓名:*** 院系:计算机科学与技术学院 专业:计算机科学与技术 年级:** 学号:******* 指导教师:*** 2015 年 09月 10 日

目录 1 课程设计的目的 (1) 2 需求分析 (3) 3 课程设计报告内容 (3) 3.1概要设计 (3) 3.2详细设计 (3) 3.3调试分析 (5) 4 总结 (7) 5 程序清单 (8) 6 参考文献 (7)

1.课程设计的目的 (1) 熟练使用C 语言编写程序,解决实际问题; (2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; (3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; (4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 2.需求分析 本程序文件主要的功能是判断括号的匹配问题。 程序的执行是从事先输入好数据的文档中读取,然后对所读取的数据进行括号匹配行的判断。最后输出判断的结果。 程序函数主要有void InitStack(Stack *S)、ElemType GetTop(Stack S,ElemType *e)、void push(Stack *S,ElemType e)、ElemType pop(Stack *S,ElemType *e)、int Judge(ElemType a[])。InitStack函数是用来初始化栈;GetTop函数是用来获取栈顶元素;push是用来把元素压栈、pop函数是用来把元素弹出栈、Judge函数是用来判断括号是否匹配。 3 括号匹配的设计 3.1概要设计 算法分析: 首先设置好一个栈,然后从文件中读入数据,在读入的数据时,从文件中读取的字符串存入到函数定义好的字符数组中。然后把该数组作为函数参数。当每读入一个‘(’或者是‘[’,就把这个元素压栈,若是读入的元素是‘]’或者是‘)’,就调用GetTop函数,来获取栈顶元素,如果获取的栈顶元素和该次读入的元素匹配而且栈不空的话,就说明该元素是匹配的,继续比较下一次的元素;如果获取的栈顶元素和该次读入的元素不匹配的话,就说明该元素是不匹配的,直接结束运行。当所有的‘)’或者是‘]’全部比较完成之后,栈仍然不空,说明栈中还剩有‘[’或者‘(’,括号不匹配。 3.2详细设计 void InitStack(Stack *S)//建造一个栈 { S->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType)); if(!*S->base) printf("error"); S ->top = S ->base;//将栈设置为空栈 S->stacksize = STACK_INIT_SIZE;//将栈的空间大小设置为STACK_INIT_SIZE } 建栈的操作首先将栈指针s->指向新开辟的内存空间。然后将栈顶指针s->top等于s->base。将栈置成空栈。 ElemType GetTop(Stack S,ElemType *e)//获取栈顶元素 { if(S.top!=S.base) { *e=*(S.top-1); return *e; }

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

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

课程设计报告——括号匹配问题

课程设计报告——括号匹配问题

————————————————————————————————作者:————————————————————————————————日期: ?

1. 设计目的 1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。 2、提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。 4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。 2.设计内容 2.1 系统名称 括号匹配问题:括号匹配问题就是给定任意判别式,然后检验括号的配对出现的情况。 2.2要求 假设一个算术表达式中可包含三种括号:圆括号、中括号、花括号且这三种括号可按任意次序嵌套使用。试利用栈的运算,编写判别给定式中所含括号是否正确配对出现的算法。 任意运用一种计算机语言,分析问题,写出具体程序,要求能够在对应的系统中实现该问题的,实验通过计算机来完成。 独立完成,可通过查阅资料来解决自己不会的问题,提高自己查阅文献的能力级独立思考的能力。

3.程序设计步骤 3.1 程序流程分析图 图3-1 程序流程图 3.2 主要的数据结构类型 typed ef st ruc t { ? int top; ch ar S zstack[Max Siz e]; }Text; 开给定判断 检验 左右入找栈 配对删除不配对,则栈空 栈不 结

算法设计与分析实验

算法设计与分析 学号:120410101 姓名:陈颖萍 班级:1204101 日期:2014.01.01

实验题目1 1-1问题描述: 括号检验:输入一个代数表达式,表达式只能含有+,—,*,/,1,2,3,4,5,6,7,8,9,0字符且每个数字均小于10,设表达式除括号外匹配有误外,再无其他错误。编写算法对输入的表达式进行检验,判断括号匹配是否正确。 正确的:错误的: 1+2+4 (1+)2 (1+2)+4 (1+2(4+3)) (1+2) (1+2+3*(4+5())) 1+2+3*(4+5)) 1-2问题分析: 编写算法对输入的表达式进行检测,判断括号匹配是否正确。如果对于输入的表示能按照正确的优先级将最终结果求出那么表达式肯定是正确的。而如果要求出最终结果,效率会低,那么对运算过程进行简化,按照所给的表达式推导出最终可以求出结果那么表达式肯定是正确的,括弧肯定匹配。 1-3策略选择: 采用蛮力法,从右向左处理表达式一旦出现错误的情况直接输出不匹配退出,否则继续进行处理直至表达式结束。用栈作为存储结构约定优先级。Stack S,OP; S存储运算符,OP存储参与运算的数字。遇到‘(’、数字,时直接压入相应的栈中,当遇到+、-、*、/操作符是先把栈S中的栈顶元素取出比较相应的优先级,若当前操作符的优先级低与栈顶的则进行一次运算。不断计算直至符合结束条件。 1-4模型: 采用信息数字化的方法,用栈作为存储结构约定优先级。Stack S,OP; S存储运算符,OP存储参与运算的数字。遇到‘(’、数字,时直接压入相应的栈中,当遇到+、-、*、/操作符是先把栈S中的栈顶元素取出比较相应的优先级,若当前操作符的优先级低与栈顶的则进行一次运算。由于问题要求的是单位数而进行相应的运算后可能会变成小数,或多位数,若对其进行处理会麻烦,则默认运算后结果是1,将以压入相应的栈中。若在运算过程中不能进行或不可操作则说明表达式不正确。 1-5时间及空间复杂度分析 1-6算法描述(流程图): 1-7算法实现: 1-8测试及说明: 1-9总结 实验题目2 2-1问题描述: 某售货员要到若干城市去推销商品,已知个城市之间的路程(或旅费)。要选择一条从驻地出发,经过每一个城市一遍,最后回到驻地的路线,使总的路线最小。问题的解为从一个带权图中找到一个包含所有顶点的回路,且该回路的权值之和最小。用邻接矩阵存储图。 2-2问题分析: 该问题可以用邻接矩阵存储图,图的下标表示两个城市,图的权值表示两城市间的路程,此时的邻接矩阵是关于主对角线对称的。在此问题中要设定NoEdge =-1来表示当两个城市间无通路时邻接矩阵存储的值,方便在连接结点时进行判断。

括号匹配实验报告

实验报告 课程名称:数据结构班级:实验成绩: 实验名称:栈、队列、字符串和数组学号:批阅教师签字: 实验编号:实验二姓名:实验日期: 指导教师:组号:实验时间: 一、实验目的 (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)//创建空栈

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

一、实验题目 设计算法判断一个算数表达式的圆括号是否正确配对。 二、问题分析 这道题用到的是栈的知识,这个程序要求我们知道如何对一个字符串进行存储,判断算数表达式是否配对正确的关键是对表达式进行扫描,熟悉圆括号的进出栈操作。 三、概要设计 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)测试结果截图:

判断算术表达式中的括号是否配对

南京信息工程大学数据结构实验(实习)报告 实验(实习)名称顺序表、单链表实验(实习)日期2015-10-11 得分指导教师顾韵华系计软院专业计科年级2014级班次 2 一、实验目的 1、掌握栈的顺序实现、栈的基本应用 二、实验内容 1、给出栈的顺序存储的定义及程序实现。 2、应用顺序栈,编程实现由十进制到十六进制的转换。 3、设计一个算法,编写程序实现:判断一个算术表达式中的括号是否配对,并求出括号的最大嵌套层数。 三、数据结构设计和实现 1.进制转换 #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 //常量定义 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define True 1 #define False 0 //函数返回值定义 typedef int Status; typedef int SElemType; typedef struct { SElemType * base; SElemType * top; int stacksize; }SqStack; Status InitStack(SqStack &s);//构造一个空栈 Status DestroyStack(SqStack &s);//销毁栈 Status ClearStack(SqStack &s);//把s置为空栈 Status StackEmpty(SqStack s); int StackLength(SqStack s);//返回栈的元素个数 Status GetTop(SqStack s,SElemType &e);//返回栈顶元素 Status Push(SqStack &s,SElemType e);//插入元素为新的栈顶元素 Status Pop(SqStack &s,SElemType &e);//取出栈顶元素 Status StackTraverse(SqStack s,Status(*vist)()); void conversion(int x);//十进制转换十六进制

数据结构实验指导书实验3

实验三栈操作 一、实验目的 1.熟悉栈的的顺序存储结构和链式存储结构定义; 2.掌握栈的基本操作,如:压栈、弹栈、判栈空、判栈满等运算。 3.掌握栈的特点(先进后出FILO),并能在实际问题背景下灵活应用。二、实验内容 示例程序1:圆括号匹配的检验(LinkStack.h+LS_ParenMatch.cpp)本示例程序在头文件LinkStack.h中定义了栈的链式存储结构,并实现了链栈的基本操作(判栈空、构造、压栈、弹栈、销毁栈等)。在文件LS_ParenMatch.cpp 中实现了栈基本操作的一个实际应用:圆括号()匹配的检验。要求学生利用头文件LinkStack.h中已经定义的栈的基本操作实现栈的其他应用,或在头文件中添加其他关于栈的基本操作。 1.LinkStack.h中代码如下: //链栈基本操作的实现 #include #include #define NULL 0 //定义栈中元素的类型,可根据实际数据类型进行定义 //typedef char StackElementType;//栈中元素的类型 //#define PF "%c" //元素输出格式 //定义栈的链式存储结构 typedef struct node { StackElementType data; struct node *next; }LinkStack; //链栈基本操作的说明 int IsEmpty(LinkStack *top);//判栈空 LinkStack *Push(LinkStack *top,StackElementType x);// 压栈

相关文档
最新文档