表达式的合法判断

来源:互联网 发布:mysql 更新字段加一 编辑:程序博客网 时间:2024/05/01 18:22

题目:

表达式合法判断

写一段代码,判断一个包括’{‘,’[‘,’(‘,’)’,’]’,’}’的表达式是否合法(注意看样例的合法规则。)
给定一个表达式A,请返回一个bool值,代表它是否合法。 测试样例: “[a+b*(5-4)]{x+b+b({1+2)}}”
返回:true 测试样例: “[a+b*(5-4)]{x+b+b(({1+2)}}” 返回:false

分析:

1、通过用例可以判断出,不用纠结三种括号的对应,只要求正括号和反括号对应即可。

2、用栈来解决这个问题非常适合。

//      int *array = new int[n];//设立一个栈        int top = 0;//栈顶指针        ……                  else if (c == 1){//当找到正括号时,入栈//              array[top] = c;                top++;            }            else if(c == 2){//当找到反括号时,出栈                top--;                if (top < 0){//注意溢出,反括号比正括号多时//                  delete array;                    return false;                }            }        ……        //注意删除动态数组//      delete array;        if(top==0){//栈顶指针归零,代表括号成对或没有找到过括号            return true;        }        else{//不成对            return false;        }    ……

后来发现把栈数组删掉也毫不影响,只需要用top计数就可以。
是不是简洁多了

class ChkExpression {public:    bool chkLegal(string A) {        int n = A.length();        int top = 0;//栈顶指针        int i;        for (i = 0; i < n; i++){            int c = isBracket(A[i]);            if (c == 0){                continue;            }            else if (c == 1){                top++;            }            else if(c == 2){                top--;                if (top < 0){//反括号比正括号多                    return false;                }            }        }        if(top==0){            return true;//成对        }        else{            return false;//不成对        }    }

3、专门写一个成员方法识别括号。

int isBracket(char a){        if (a == '{' || a == '[' || a == '('){            return 1;        }        else if (a == '}' || a == ']' || a == ')'){            return 2;        }        else{            return 0;        }       }
0 0
原创粉丝点击