//Dijkstra的双栈算术表达式
public static Double dijkstra(String str){
//创建双栈,一个存储运算符,一个存储操作数
Stack<Double> vals = new Stack<Double>();
Stack<Character> op = new Stack<Character>();
char[] ch = str.toCharArray();
/*
* 遍历表达式字符数组
* 遇到左括号省略,
* 遇到操作数压如操作数栈
* 遇到预算符压人运算符栈
* 遇到右括号弹出一个操作数,弹出一个操作符
* 然后再弹出一个操作数根据弹出的运算符进行运算,运算的结果再次压人操作数栈中
* 按照此顺序遍历完成
* */
for(int i = 0;i < ch.length;i++){
if(ch[i] == '+') op.push(ch[i]);
else if(ch[i] == '-') op.push(ch[i]);
else if(ch[i] == '*') op.push(ch[i]);
else if(ch[i] == '/') op.push(ch[i]);
else if(ch[i] == '(');
else if(ch[i] == ')'){
//进行运算
char o = op.pop();
Double val = vals.pop();
if(o == '+') val = val + vals.pop();
else if(o == '-') val = vals.pop() - val;
else if(o == '*') val = vals.pop() * val;
else if(o == '/') val = vals.pop() / val;
//结果压人操作数栈
vals.push(val);
}else{
vals.push(Double.parseDouble(Character.toString(ch[i])));
}
}
return vals.pop();
}
Dijkstra的双栈算术表达式
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 最近因为一些原因,我需要写一个简易的计算器,需要支持加减乘除,小数和负数运算。其实思路很简单,无非就是使用双栈解析...
- 基本思路 首先,用户输入的待求表达式,也就是中缀表达式,对于人来说,这个很好理解,但是对于计算机,后缀表达式求值更...
- 引言 上篇文章中,我们把栈的概念,栈的两种实现方式:顺序栈、链栈做了一个介绍,相信大家对栈这个概念有了初步的认识了...