算法-表达式求值(Dijkstra双栈)
2018-01-30 09:49
337 查看
package jiChu; import java.util.ArrayList; /** 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。 输入格式 输入一行,包含一个表达式。 输出格式 输出这个表达式的值。 样例输入 ((1-2)+(3*(4-5))) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行。 */ import java.util.Scanner; import java.util.Stack; public class TTTTTTTT { public static void main(String[] args) { Stack<String> ops=new Stack<String>();//运算符栈 Stack<Double> vals=new Stack<Double>(); //操作数栈 ArrayList<String> list=new ArrayList<String>(); Scanner input=new Scanner(System.in); String str=input.next(); input.close(); String s = ""; for(int i=0;i<str.length();i++) { if(str.charAt(i)==40||str.charAt(i)==41||str.charAt(i)==42||str.charAt(i)==43||str.charAt(i)==45||str.charAt(i)==47) { //括号,加减乘除号 s=str.charAt(i)+""; list.add(s); s=""; //先清空,运算符一定是单个个,不需要追加 }else if(str.charAt(i)<=57&&str.charAt(i)>=48) { //数字 s+=str.charAt(i); list.add(s); } } int i=0; while(!list.isEmpty()&&i<str.length()) { String ss=list.get(i++); if(ss.equals("(")) {} //左括号不管 else if(ss.equals("+")) ops.push(ss); else if(ss.equals("-")) ops.push(ss); else if(ss.equals("*")) ops.push(ss); else if(ss.equals("/")) ops.push(ss); else if(ss.equals(")")) { //右括号,开始处理数据 String op=ops.pop(); //一个运算符出栈 double v=vals.pop(); //一个数据出栈 if(op.equals("+")) v=vals.pop()+v; //如果为加号,则再出栈一个数据来和刚才的数据相加并存入刚才的变量中 else if(op.equals("-")) v=vals.pop()-v; else if(op.equals("*")) v=vals.pop()*v; else if(op.equals("/")) v=vals.pop()/v; vals.push(v); //运算后的结果入栈 }else vals.push(Double.parseDouble(ss)); //如果不是运算符,则一定是数据,进入数据栈 } System.out.println(vals.pop()); //如果都运算完,数据栈只会剩余一个元素 } }
Dijkstra双栈的思想是,一个栈存储数据,一个栈存储运算符,遇到右括号就计算,但是我发现一个问题是,这个思想必须要保证右括号全部包括整个表达式,比如正常人们写表达式可能是1-2+3*(4-5),但是这个题这样是计算不出来的,必须((1-2)+(3*(4-5)))。
相关文章推荐
- 算法(第四版) Dijkstra 算数表达式求值算法-双栈
- Dijkstra双栈表达式求值算法
- Dijkstra 的双栈算数表达式求值算法的学习
- Dijkstra的双栈算数表达式求值算法
- 蓝桥杯-表达式求值(Dijkstra双栈)
- Dijkstra的双栈算法表达式求值算法
- 【算法】E.W.Dijkstra算术表达式求值
- 《算法》第一章——Dijkstra双栈表达式求值
- 经典算法-算术表达式求值
- 后缀表达式的求值的算法
- 经典算法-算术表达式求值
- 严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值
- 算法-波兰表达式求值(递归)
- 后缀表达式的求值的算法
- 写了个表达式求值的算法
- 表达式求值简便算法
- 算法笔记_044:表达式计算求值(Java)
- 后缀表达式的求值的算法
- 后缀表达式的求值的算法
- 算法3-4 表达式求值