您的位置:首页 > 其它

算法-表达式求值(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)))。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: