码迷,mamicode.com
首页 > 其他好文 > 详细

中缀表达式转化为后缀表达式

时间:2016-04-24 21:41:25      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

后缀表达式

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) ?”;后者写做“3 4 - 5 *”。


调度场算法

  • 当还有记号可以读取时
    • 读取一个记号
      • 表示一个数字,添加到输出队列中
      • 表示一个函数,压入栈中
      • 一个函数参数的分隔符(,)
        • 从占中不断的弹出操作符,并且放入输出队列中去,知道栈顶部的元素为一个左括号为止。
          • 如果一直没有遇到左括号
            • 分隔符放错了位置
            • 括号不匹配
      • 一个操作符,记做O1
        • 只要存在另一个O2的操作符位于栈的顶端
          • 如果O1是左结合性的并且它的运算符优先级要小于或等于O2的优先级,或者如果O1是右结合性的并且它的运算符优先级比O2的低,那么O2从栈顶弹出并且放入输出队列中(循环直至以上条件不满足为止,如果O1左结合性,直到遇上优先级比O1低的,停止,如果O1右结合性,直到遇上优先级比O1相等的或低的)
          • 然后,将O1压入栈的顶端
      • 左括号
        • 压入栈中
      • 右括号
        • 从栈当中不断的弹出操作符并且放入输出队列中,直到弹出的元素为左括号为止
        • 将左括号从栈的顶部弹出,但并不放入输出队列中去
        • 如果在找到一个左括号之前,栈就已经弹出了所有元素,那么久表明在表达式中存在不匹配的括号
  • 当再没有记号可以读取时
    • 如果在栈中还有操作符
      • 如果此时位于站顶端的操作符是一个括号,那么就表示在表达式中存在不匹配的括号
      • 将操作符逐个弹出并放入输出队列中去
  • 退出算法

后缀表达式(逆波兰)求值

一般是基于堆栈的,算法一般这样描述

操作数入栈,遇到操作符时,操作数出栈,求值,将结果入栈;如此重复。

伪代码
  • while有输入符号
    • 读入下一个符号x
    • IF X是一个操作数
      • 入栈
    • ELSE IF X是一个操作符
      • 有一个先验的表格给出该操作符需要n个参数
      • IF堆栈少于n个操作数
        • (错误)用户没有输入足够的操作数
      • ELSE,n个操作数出栈
      • 计算操作符
      • 将计算所得的值入栈
    • IF 栈内只有一个值
      • 这个值就是整个计算式的结果
    • ELSE 多余一个值
      • (错误)用户输入了多余的操作数


实际实现过程中出现的问题

字符串如何切割成一个字符

  1. for(int i; i <expss.lengh();i++)
  2.     visit(new Character(s.charAt(2)).toString());

判断字符串是否数字


equals的使用

java的引用类型


需要加入正则表达式

  1. public static boolean isInteger(String str) {
  2. Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
  3. return pattern.matcher(str).matches();
  4. }
匹配空格
\s

字符串转化为数字


静态成员初始化

中间会抛出两次

除法注意除数和被除数

还差小数没调整好





中缀表达式转化为后缀表达式

标签:

原文地址:http://www.cnblogs.com/gain/p/5428153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!