[algorithm] Dijkstra双栈算法表达式求值算法
一、原理
Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数),
表达式由括号,运算符和操作数组成。
(1).将操作数压入操作数栈
(2).将运算符压入运算符栈;
(3).忽略左括号;
(4).在遇到右括号时候,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈。
二、算法轨迹图
左括号忽略,右括号开始出栈计算

三、代码
import java.util.Scanner;
import java.util.Stack; /**
* Dijkstra双栈算术表达式求值算法
* @author xwolf
* @date 2017-05-24 18:45
* @since 1.8
*/
public class Dijkstra {
private static Stack<String> ops = new Stack<>();
private static Stack<Integer> vals = new Stack<>();
public static int calculator(){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String exp = scanner.next();
System.out.println(exp);
if ("exit".equals(exp)){
System.exit(1);
}
if ("over".equals(exp) && !vals.isEmpty()){
return vals.pop();
}
switch (exp){
case "(":
break;
case "+":
ops.push(exp);
break;
case "-":
ops.push(exp);
break;
case "*":
ops.push(exp);
break;
case "/":
ops.push(exp);
break;
case "%":
ops.push(exp);
break;
case ")":
while(!ops.isEmpty() && !vals.isEmpty()){
String op = ops.pop();
int result = get(op,vals.pop(),vals.pop());
vals.push(result);
}
break;
default:
vals.push(Integer.parseInt(exp));
break;
}
}
return 0;
} private static int get(String op,int val,int bval){
int result = 0 ;
switch (op){
case "+":
result = bval+val;
break;
case "-":
result = bval-val;
break;
case "*":
result = val*bval;
break;
case "/":
result = bval/val;
break;
case "%":
result = bval % val;
break;
}
return result;
}
}
参考:
《算法 第4版》
[algorithm] Dijkstra双栈算法表达式求值算法的更多相关文章
- Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...
- 算法手记(2)Dijkstra双栈算术表达式求值算法
这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...
- Dijkstra的双栈算术表达式求值算法 C++实现
#include<iostream> #include<string> using namespace std; template<typename T> clas ...
- 双栈算术表达式求值算法 栈(Stack) - Java实现
https://mp.weixin.qq.com/s/dg8mgd6CIQ7Tui1_fQwSBA https://github.com/toywei/DataStructure/tree/maste ...
- 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决
1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...
- page80-栈用例-算术表达式求值
表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时 ...
- LeetCode150 逆波兰表达式求值
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 【算法】E.W.Dijkstra算术表达式求值
算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...
- 栈的一个实例——Dijkstra的双栈算术表达式求值法
Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...
随机推荐
- .Net机试题——编写一个BS架构的多层表结构的信息管理模块
要求: 编写一个BS架构的多层表结构的信息管理模块,用户体验需要注意.包含错误处理,需要最终能完整的跑起来.页面可以不美化,但是整洁还是必须的.在不能完成详细功能需求的情况下优先保证基本功能. 1 ...
- 推荐两款好用的反编译工具(Luyten,Jadx)
使用JD-Gui打开单个.class文件,总是报错// INTERNAL ERROR 但当我用jd-gui反编译前面操作获得的jar文件的时,但有一部分类不能显示出来--constants类,仅仅显示 ...
- DBProxy
DBProxy/USER_GUIDE.md at master · Meituan-Dianping/DBProxy https://github.com/Meituan-Dianping/DBP ...
- fatal error C1859 意外的预编译头错误,只需重新运行编译器(转)
微软的建议 要解决此问题,请使用下列方法之一. http://support.microsoft.com/kb/976656/zh-cn 方法 1 禁用/analyze编译器选项,则它会被启用. 方法 ...
- winform 中 给DataGridView的表头添加CheckBox
在C/S架构中,给DataGridView的表头添加CheckBox控件: 添加类: /// <summary> /// 给DataGridView添加全选 / ...
- Unity Shader-后处理:Bloom全屏泛光
一.简介 今天来学习一下全屏Bloom效果,有时候也叫Glow效果,中文一般叫做“全屏泛光”,这是一种可以模拟出HDR的全屏后处理效果,但是实现原理与HDR相差很远,效果比HDR差一些,但是比HD ...
- SpringBoot使用Mybatis注解开发教程-分页-动态sql
代码示例可以参考个人GitHub项目kingboy-springboot-data 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframe ...
- pid 控制算法
http://blog.csdn.net/huangkangying/article/details/78129148 https://zh.wikipedia.org/wiki/PID%E6%8E% ...
- win32 进程崩溃时禁止弹出错误对话框
在程序初始化的时候加入以下代码即可: SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); _set_abort_behav ...
- Data Structure Visualizations
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html