栈和计算器-匹配和检查表达式元素合法性
private bool Match() {
    int index = 0;
    int exprLength = this._expression.Length;
    int lKuo = 0;
    int rKuo = 0;

    while (index != exprLength) {
        char who = this._expression[index];
        char next = '\0';
        if (index != exprLength-1)
        {
            next = this._expression[index + 1];
        }
                
                
        switch (who)
        {
            case '(':
                if (index == exprLength - 1 || isRightKuo(next) || isSymbol(next)) {
                    return false;
                }
                lKuo++;

                //保证前面的左括号多于右括号
                if (rKuo >= lKuo) {
                    return false;
                }

                this._elements.Add("(");
                index++;
                break;

            case ')':
                rKuo++;
                if (index == exprLength - 1) {
                    this._elements.Add(")");
                    index++;
                    break;
                }

                if (index == 0 || isLeftKuo(next) || isNumber(next)) {
                    return false;
                }
                        
                if (rKuo > lKuo) {
                    return false;
                }

                this._elements.Add(")");
                index++;
                break;

            default:
                //如果是符号类型
                if (isSymbol(who)){
                    if (index == 0 || index == exprLength - 1) {
                        return false;
                    }

                    if (isRightKuo(next) || isSymbol(next)) {
                        return false;
                    }

                    this._elements.Add(who.ToString());
                    index++;
                    break;
                }

                        
                if (!isNumber(who)) {
                    return false;
                }

                //剩下为数字,匹配数字的范围
                int numberLenth = 0;
                bool isXiaoShu = false;

                while (isNumber(this._expression[index + numberLenth]) || this._expression[index + numberLenth] == '.') {
                    if (this._expression[index + numberLenth] == '.') {
                        if (isXiaoShu)
                        {
                            //不能有两个小数点以上
                            return false;
                        }
                        else
                        {
                            isXiaoShu = true;
                        }
                    }

                    int myIndex = index + numberLenth;
                    numberLenth++;
                    if (myIndex == exprLength - 1) {
                        //最后一个元素
                        break;
                    }
                            
                }
                string num = this._expression.Substring(index, numberLenth);
                this._elements.Add(num);
                index += numberLenth;
                
                //检查数字的下一个元素
                if(index != exprLength)
                {
                   next = this._expression[index];
                }
                                                        
                if (isLeftKuo(next)) {
                   return false;
                }

                break;
        }
    }

    if (lKuo != rKuo) {
        return false;
    }

    return true;
            
}

向后检查法,只检查当前元素和后面元素的合法性,遍历表达式的每一个元素。

元素类型分为:左括号、右括号,运算符号、数字

左括号,不能是最后一个元素吧。后面不能是右括号和运算符号吧!

右括号,不能是第一个元素吧。后面一定是运算符号吧,其他情况不合格

运算符号,不能是第一和最后一个元素吧。后面不能是运算符号和右括号吧!

数字,后面不能是左括号吧!

匹配元素,主要的就是要把数字匹配出来,只要遇到数字,就一直下一个,直到不是数字为止,注意小数点的出现,只能出现一次,且不是数字的第一位。


首页 我的博客
粤ICP备17103704号