//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的双栈算术表达式
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 最近因为一些原因,我需要写一个简易的计算器,需要支持加减乘除,小数和负数运算。其实思路很简单,无非就是使用双栈解析...
- 基本思路 首先,用户输入的待求表达式,也就是中缀表达式,对于人来说,这个很好理解,但是对于计算机,后缀表达式求值更...
- 引言 上篇文章中,我们把栈的概念,栈的两种实现方式:顺序栈、链栈做了一个介绍,相信大家对栈这个概念有了初步的认识了...