美文网首页
双栈实现补齐括号

双栈实现补齐括号

作者: Kino_7abb | 来源:发表于2019-01-10 23:08 被阅读0次

双栈

今天看算法4 里面的一道练习题,百思不得其解,百度发现可以用双栈实现;
编写一段程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如
输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
输出:( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )

解决思路:

使用两个栈分别保存数值和操作符,分别为opr和data。顺序处理输入字符串的字符:

  • 如果为操作符,压入opr。
  • 否则,如果为右括号,从data取出两个操作数,从opr取出1个操作符,添加括号组合后压入data。
  • 否则,为数字,压入data。

以上处理办法需要输出满足以下条件,也就是有如下的假设:

  • 输出表达式是合法的
public static void main(String[] args) {

      //双栈法
      //数值栈,压入数值
      LinkedListStack<String> dataStack = new LinkedListStack<>();
      //操作符栈,压入+-*/
      LinkedListStack<String> oprStack  = new LinkedListStack<>();
      String str ="1+2)*3-4)*5-6)))";
      String[] param = str.split("");

      for(int i= 0 ; i< str.length();i++){
          if(param[i].equals("+") || param[i].equals("-") || param[i].equals("*") || param[i].equals("/")){
              oprStack.push(param[i]);
          }else if(param[i].equals(")")){
              StringBuilder res = new StringBuilder();
              //因为是压栈,压进去的是相反的
              res.append(")").append(dataStack.pop()).append(oprStack.pop()).append(dataStack.pop()).append("(");
              dataStack.push(res.toString());
          }else {
              dataStack.push(param[i]);
          }
      }
      String res = dataStack.pop();
      System.out.println(res);
      StringBuilder temp = new StringBuilder();

      for(int i= res.length() -1; i>=0; i--){  
          temp.append(res.charAt(i));
      }
      System.out.println(temp.toString());

  }
}

整个过程看下来我是觉得,这个设计精巧,通过一个存储操作符一个存储数值,然后通过')'来判断缺不缺,遇到)则补上( ,由于是栈的出来的表达式是反的,这样反转一下,就得出最终结果

相关文章

  • 双栈实现补齐括号

    双栈 今天看算法4 里面的一道练习题,百思不得其解,百度发现可以用双栈实现;编写一段程序,从标准输入得到一个缺少左...

  • #检查字符串中括号是否正确配对

    利用栈来实现,若为左括号,将字符入栈,若为右括号,栈顶是否为其对应左括号,若对应,栈顶元素出栈。循环结束,若栈为空...

  • Tourist with Data Structure Fift

    设计循环列表 岛屿的数量 最小栈 有效的括号 每日温度 逆波兰表达式求值 克隆图 目标和 用栈实现队列 用栈实现队...

  • 检测成对括号

    检测成对出现的括号 利用栈的知识点遍历字符串,遇到左括号进栈,右括号出栈进出栈的括号不匹配则 return false

  • 算法面试通关-堆栈&队列《三》

    队列 FIFO 栈 FILO 优先队列用堆实现或者二叉查找树 0020-有效的括号0232-用栈实现队列0225-...

  • 数据结构与算法 --- 栈习题(Swift)

    首先实现一个顺序存储的栈。 一。括号匹配检验 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套顺序随意,即()...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • chap3-栈和队列

    括号匹配问题 // 括号匹配,遇到 '\0' 结束// 遇到花、中、圆左括号进栈,遇到花、中、圆右括号检查栈顶元素...

  • 20. Valid Parentheses

    使用栈数据结构: 遇到左括号,需要压栈。 遇到右括号,判断栈顶是否和当前右括号匹配;若不匹配则返回false,否则...

  • 20. 有效的括号

    自己解法 括号匹配问题,第一想法就是使用栈,左括号入栈,遇到匹配的右括号出栈,如果中间有不符合的右括号,直接返回f...

网友评论

      本文标题:双栈实现补齐括号

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