算法:补齐左括号

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010841296/article/details/77017594

例如
输入:1+1)*3+4)/5)
输出:(1+1)*((3+4)/5)

public String convert(String param){
      Stack<String> leftStack = new Stack<>();
      Stack<String> rightStack = new Stack<>();
      char[] chars = param.toCharArray();
      for (int i = 0; i < chars.length; i++) {
          char c = chars[i];
          //操作符入右栈
          if(c == '+' || c=='-'||c=='*' ||c=='/'){
              rightStack.add(String.valueOf(c));
          }
          //遇到右括号,要把左栈的2个操作数pop出,连接右栈操作符,然后补齐左右括号
          else if(c == ')'){
              String left2 = leftStack.pop();
              String left1 = leftStack.pop();
              leftStack.add("("+left1+rightStack.pop()+left2+")");
          }
          //其余的是操作数,要注意2位数及以上的,要拼起来
          else{
              String num = c+"";
              while((i+1)<chars.length
              &&Character.isDigit(chars[i+1])) {
                  num += c;
                  i++;
              }
              leftStack.add(num);
          }
      }
      //正常来说,遍历结束后,右栈都会留有一个操作符
      while(rightStack.size()>0){
          String left2 = leftStack.pop();
          String left1 = leftStack.pop();
          leftStack.add(left1+rightStack.pop()+left2);
      }
      //这里记得要按顺序pop出来,栈中越靠栈顶的,排位越往右
      String result = "";
      while(leftStack.size()>0){
          result = leftStack.pop()+result;
      }
      return result;
}

猜你喜欢

转载自blog.csdn.net/u010841296/article/details/77017594
今日推荐