后缀表达式
逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“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 *”。
来源: https://zh.wikipedia.org/wiki/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95
调度场算法
- 当还有记号可以读取时
- 读取一个记号
- 表示一个数字,添加到输出队列中
- 表示一个函数,压入栈中
- 一个函数参数的分隔符(,)
- 从占中不断的弹出操作符,并且放入输出队列中去,知道栈顶部的元素为一个左括号为止。
- 如果一直没有遇到左括号
- 分隔符放错了位置
- 括号不匹配
- 一个操作符,记做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 多余一个值
- (错误)用户输入了多余的操作数
实际实现过程中出现的问题
字符串如何切割成一个字符
for(int i; i <expss.lengh();i++)
visit(new Character(s.charAt(2)).toString());
判断字符串是否数字
http://javapub.iteye.com/blog/666544
equals的使用
java的引用类型
需要加入正则表达式
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
匹配空格
\s
字符串转化为数字
静态成员初始化
中间会抛出两次
除法注意除数和被除数
还差小数没调整好
时间: 2024-10-12 00:30:30