设计一个算法判别用字符串表示的表达式中开、闭括号是否配对出现
2013-06-03 13:26
746 查看
原题:设计一个算法判别用字符串表示的表达式中开、闭括号是否配对出现。
#include<iostream.h> #include<stdlib.h> #define INIT_SIZE 100 //存储空间初始分配量 #define INCREMENT 10 //存储空间分配增量 #define ElemType char #define SIZE 100 //字符串数组的大小 typedef struct { ElemType *base;//在栈构造之前和销毁之后,base值为NULL ElemType *top;//栈顶指针 int stacksize;//当前已分配的存储空间,以元素为单位 }SqStack; int InitStack(SqStack &S) {//构造一个空栈 S.base=new ElemType[INIT_SIZE]; if(S.base == NULL) {//溢出 cout<<"存储空间分配失败!"<<endl;return -1; } S.top=S.base;//S.top=S.base表示为空栈 S.stacksize=INIT_SIZE;//为栈容量赋初值 return 1; } int Pop(SqStack &S,char &ch) {//如栈非空,则删除栈顶元素 if(S.base == S.top) {//栈空条件下执行 cout<<"当前栈已空!"<<endl;return -1; } ch=*--S.top;//可利用e返回被删除的栈顶元素值 return 1; } int Push(SqStack &S,char ch) {//入栈操作 if(S.top - S.base >= S.stacksize) {//栈满条件下,扩大栈的容量 ElemType *tem,*p; int i=0; tem=new ElemType[S.stacksize + INCREMENT];//新栈的空间 if(tem == NULL) {//溢出 cout<<"追加存储空间失败!"<<endl<<endl;return -1; } p=S.base; while(p != S.top)//复制数据元素值到tem所指空间中 tem[i++]=*p++; delete[] S.base;//释放S.base所指空间 S.base=tem;//S.base指向新空间 S.top=S.base + S.stacksize;//设置新栈顶 S.stacksize+=INCREMENT;//设置新栈容量 } *S.top++=ch; return 1; } int GetTop(SqStack S,char &ch) {//如栈非空,则将其打印输出 if(S.base == S.top) { cout<<"当前栈已空!"<<endl;return -1; } ch=*(S.top - 1);//可利用e返回栈顶元素值 return 1; } int StackEmpty(SqStack S)//判断栈是否为空 { if(S.top == S.base) { return 1; } else { return -1; } } int Match(char *str) { SqStack S; InitStack(S);//初始化栈 char *p=str;//p指向字符串的第一个字符 char ch; while(*p!='\0') { if(*p=='(' || *p=='[') Push(S,*p);//如果读入的字符是'('或'[',则入栈 else if(*p==')') {//读入的字符是')' if(StackEmpty(S)==1) {//如果栈空则不匹配 cout<<"括号不匹配!"<<endl;return -1; } else if(GetTop(S,ch),ch=='(') Pop(S,ch);//如果栈顶是'(',则出栈 else {//否则不匹配 cout<<"括号不匹配!"<<endl;return -1; } } else if(*p==']') {//读入的字符是')' if(StackEmpty(S)==1) {//如果栈空则不匹配 cout<<"括号不匹配!"<<endl;return -1; } else if(GetTop(S,ch),ch=='[') Pop(S,ch);//如果栈顶是'[',则出栈 else {//否则不匹配 cout<<"括号不匹配!"<<endl;return -1; } } p++;//当前读入的字符是其他字符或括号匹配,则继续读入 } if(StackEmpty(S)==1) {//栈空则括号匹配 cout<<"括号匹配!"<<endl;return 1; } else {//栈不空则左右括号不匹配 cout<<"括号不匹配!"<<endl;return -1; } } int main() { char str[SIZE]; cout<<"请输入字符串序列:"<<endl; cin.getline(str,SIZE); Match(str); return 1; }
相关文章推荐
- 一个判别表达式中开、闭括号是否配对出现的算法
- 假设表达式中包含三种括号 圆括号方括号大括号 设计一个算法用顺序栈判断表达式中的括号是否正确配对
- 判别给定表达式中所含括号是否正确配对出现的算法
- 【数据结构基础】判别给定的表达式所含括号是否正确配对出现的算法。
- 假设表达式中允许包括3中括号:(,[,{,设计一个算法采用顺序栈判断表达式中的括号是否正确配对
- 判断一个括号字符串是否配对出现
- 括号配对:假设一个数学算式中包括圆括号"()",方括号”[]"和花括号“{}”三种类型,编写一算法判断表达式的括号是否配对。
- 假设一个数学算法中包括圆括号(),方括号[],花括号{}三种类型,编写表达式的括号是否配对
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 6.33③ 假定用两个一维数组L[1..n]和R[1..n]作为 有n个结点的二叉树的存储结构, L[i]和R[i]分别指 示结点i的左孩子和右孩子,0表示空。试写一个算法 判别结点u是否为结点v的
- 设计一个算法,判断字符串S是否对称
- 设计一个算法判断一个字符串是否是回文
- 给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 设单链表中存放n个字符,试设计一个算法,使用栈判断该字符串是否中心对称
- 算法13:检查一个表达式中的括号是否合法,括号包括 {, [, (, ), ], }
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- 1.1 设计算法判断一个字符串中字符都是否唯一的。如果不能使用额外的数据结构呢?
- 给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)