美文网首页
算法—括号匹配检验

算法—括号匹配检验

作者: 土豆骑士 | 来源:发表于2020-04-26 20:45 被阅读0次

    假设表达式中允许包含两种括号:圆括号与方括号,其嵌套顺序随意,即() 或者[([][])]都是正确的。而这种 [(]或者(()])或者([()) 都是不正确的格式. 检验括号是否匹配的方法可用"期待的急迫程度"这个概念来描述。
    例如,考虑以下括号的判断:

    括号匹配
    思路:
    1. 将第0个元素压栈
    2. 遍历[1,strlen(data)]
      (3). 取栈顶字符
      (4). 检查该字符是左括号("(","[")
      a.是左"(",则判断紧接其后的data[i]是为右")"
      YES->压栈,NO->出栈
      b.是左"[",则判断紧跟其后的data[i]是为右"]"
      YES->压栈,NO->出栈
      c.表示式如果以"#"结尾,则判断紧跟其后的data是为左"(""]"
      YES->压栈,NO->-1;

    3.遍历结束,则判断栈是否为空,为空则表示匹配成功;否则匹配失败;

    int ExecuteData1(char* data){
        
        int len = (int)strlen(data);
        
        if (len < 1) {
            return -1;
        }
        
        char *stack = malloc(sizeof(char) * len);
        int top = 0;
        stack[top] = data[0];
        
        for (int i = 1; i < len; i++) {
            char topStr = stack[top];//获取栈顶
            
            switch (topStr) {
                case '(':
                    
                    if (data[i] == ')') {//出栈
                        if (top > 0) {
                            top--;
                        }
                    } else {//入栈
                        top++;
                        stack[top] = data[i];
                    }
                    break;
                    
                case '[':
                                   
                   if (data[i] == ']') {
                       if (top > 0) {
                           top--;
                       }
                   } else {
                       top++;
                       stack[top] = data[i];
                   }
                   break;
                default:
                    if (data[i] == '(' || data[i] == '[' ) {//入栈
                        top++;
                        stack[top] = data[i];
                    }
                    break;
            }
        }
        free(stack);
        if (top == 0) {//为空栈空,则匹配成功
            return 0;
        } else {
            return -1;
        }
    }
    
    int main() {
        char data[180];
        scanf("%s",data);
        int result = ExecuteData1(data);
    
        if(result==0)printf("括号是正确匹配的\n");
        else printf("括号匹配不正确\n");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:算法—括号匹配检验

          本文链接:https://www.haomeiwen.com/subject/ersjwhtx.html