java 中缀式转后缀式
- import java.util.Stack;
- import java.util.regex.*;
- public class StringToArithmetic {
- private StringToArithmetic() {
- }
- /**
- * 给出一个算术表达式,返回结果。 例如 (5+8+10)*1,返回23
- *
- * @param string
- */
- public static double stringToArithmetic(String string) {
- return suffixToArithmetic(infixToSuffix(string));
- }
- /**
- * 中缀表达式转后缀表达式
- * 只处理了+,-,*,/和括号,没有处理负号及其它运算符,也没对前缀表达式验证。
- * 如要处理负号,可对表达式进行预转义处理,当下面条件成立时,将负号换成单目运算符"!"
- * infix.charAt[i]=='-'&&( i==0||infix.charAt[i-1]=='(')
- */
- private static String infixToSuffix(String infix) {
- Stack<Character> stack = new Stack<Character>();
- String suffix = "";
- int length = infix.length();
- for (int i = 0; i < length; i++) {
- Character temp;
- char c = infix.charAt(i);
- switch (c) {
- // 忽略空格
- case ' ':
- break;
- // 碰到'(',push到栈
- case '(':
- stack.push(c);
- break;
- // 碰到'+''-',将栈中所有运算符弹出,送到输出队列中
- case '+':
- case '-':
- while (stack.size() != 0) {
- temp = stack.pop();
- if (temp == '(') {
- stack.push('(');
- break;
- }
- suffix += " " + temp;
- }
- stack.push(c);
- suffix += " ";
- break;
- // 碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中
- case '*':
- case '/':
- while (stack.size() != 0) {
- temp = stack.pop();
- if (temp == '(' || temp == '+' || temp == '-') {
- stack.push(temp);
- break;
- } else {
- suffix += " " + temp;
- }
- }
- stack.push(c);
- suffix += " ";
- break;
- // 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
- case ')':
- while (stack.size() != 0) {
- temp = stack.pop();
- if (temp == '(')
- break;
- else
- suffix += " " + temp;
- }
- //suffix += " ";
- break;
- default:
- suffix += c;
- }
- }
- while (stack.size() != 0)
- suffix += " " + stack.pop();
- return suffix;
- }
- public static void main(String args[]){
- System.out.println(infixToSuffix("3+(2-5)*6/3"));
- System.out.println(stringToArithmetic("3+(2-5)*6/3"));
- }
- /**
- * 通过后缀表达式求出算术结果
- *
- * @param String
- * postfix
- * @return double
- */
- private static double suffixToArithmetic(String postfix) {
- Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); // 匹配数字
- String strings[] = postfix.split(" ");
- for (int i = 0; i < strings.length; i++)
- strings[i].trim();
- Stack<Double> stack = new Stack<Double>();
- for (int i = 0; i < strings.length; i++) {
- if (strings[i].equals(""))
- continue;
- if ((pattern.matcher(strings[i])).matches()) {
- stack.push(Double.parseDouble(strings[i]));
- } else {
- double y = stack.pop();
- double x = stack.pop();
- stack.push(caculate(x, y, strings[i]));
- }
- }
- return stack.pop();
- }
- private static double caculate(double x, double y, String simble) {
- if (simble.trim().equals("+"))
- return x + y;
- if (simble.trim().equals("-"))
- return x - y;
- if (simble.trim().equals("*"))
- return x * y;
- if (simble.trim().equals("/"))
- return x / y;
- return 0;
- }
- }
转载于:https://www.cnblogs.com/ikobe621/archive/2013/03/31/2991329.html
java 中缀式转后缀式相关推荐
- nyoj-257-郁闷的C小加(一 )中缀式变后缀式
题目链接:here~~~~~~~ 今天看了此题,感觉栈和队列很好用,进一步深入了解 一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+.-.*,以及括号,求表达式的值. 给出的表达式是一 ...
- NYOJ 467 中缀式变后缀式
中缀式变后缀式 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达 ...
- java自动递增前缀式和后缀式区别
java自动递增前缀式和后缀式区别 java自动递增(自动递减)前缀式表达式 '++' 操作符位于变量或表达式的前面,而后缀式表达式'++'位于变量或表达式的后面,Example: 前缀式: ++i: ...
- c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!
已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...
- nyoj 1272 表达式求值(中缀式转后缀式)
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...
- 算术表达式的前缀式、中缀式、后缀式相互转换
中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀 ...
- 语法树,前缀式,中缀式,后缀式
前序遍历:根左右 中序遍历:左根右 后序遍历:左右根 前缀式:+AB 中缀式:A+B 后缀式:AB+ 例题一: 前序遍历(前缀式):- + 4 * 1 - 5 2 / 6 3 根在前,从最后开始:-5 ...
- 逆波兰式(后缀式)详解
原表达式:a*(b*(c+d/e)-f)# /* # 为表达式结束符号*/ 后缀式:abcde/+*f-*# 为运算符定义优先级:# ( + - * / ** -1 ...
- java中缀表达式转后缀表达式(逆波兰算法)
四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等 ...
最新文章
- Regular Expression Matching
- Android下载文件(一)下载进度断点续传
- python socket发送数组_利用pyprocessing初步探索数组排序算法可视化
- 电商产品评论数据情感分析代码详解
- Git missing Change-Id in commit message footer解决方法
- dnn学习:数据访问(1)
- [洛谷P3807]【模板】卢卡斯定理
- 为什么谐振时电抗为0_变频谐振耐压试验装置在进行电缆耐压试验原理
- 微信发红包的测试用例
- 一图读懂敏捷开发参与者及基本流程
- Java中无穷大、无穷小、非数、最大值、最小值
- sql dateadd函数_什么是SQL Server DATEADD()函数?
- OAuth1.0实践之foursquare客户端同步到饭否
- Python小白的进阶之路---Day5
- Unequal Array
- 算法——取球问题(特殊球法)
- rust中文补丁steam_steam腐蚀中文设置
- 三维计算机辅助设计教程,三维计算机辅助设计教程-Pro ENGINEER.pdf
- hpp.h与.h的区别
- python整蛊:无限自动发消息给好G友...已经在挨罚了......
热门文章
- 20200922:leetcode35周双周赛题解记录(下)
- redis set不可重复_Redis的使用
- linux 关机命令_小猿圈Linux基础命令汇总
- Win32 Application 、Win32 Console Application、MFC工程项目
- 刚刚,无人驾驶公司Roadstar,发公告把联合创始人开除了
- Hinton领衔谷歌大脑新研究,拯救被认成步枪的乌龟
- Google地图更新,更AI更贴心更节约时间,就是不敢来中国
- 独家 | Face++印奇:AI是场持久战,但第一阶段明年结束
- 吴恩达悄然发布AI维基,另外他的技术岗已经招满了
- 关于hibernate的一些小记