一、原理

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双栈算法表达式求值算法的更多相关文章

  1. Dijkstra的双栈算术表达式求值算法

    这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...

  2. 算法手记(2)Dijkstra双栈算术表达式求值算法

    这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...

  3. Dijkstra的双栈算术表达式求值算法 C++实现

    #include<iostream> #include<string> using namespace std; template<typename T> clas ...

  4. 双栈算术表达式求值算法 栈(Stack) - Java实现

    https://mp.weixin.qq.com/s/dg8mgd6CIQ7Tui1_fQwSBA https://github.com/toywei/DataStructure/tree/maste ...

  5. 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

    1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...

  6. page80-栈用例-算术表达式求值

    表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时 ...

  7. LeetCode150 逆波兰表达式求值

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  8. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  9. 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...

随机推荐

  1. null与“ ”

    http://blog.csdn.net/eroswang/article/details/8529817 MySQL数据库是一个基于结构化数据的开源数据库.SQL语句是mysql数据库中核心语言.不 ...

  2. 喵哈哈村的魔法考试 Round 16 (Div.2) 比赛题解

    A 实际上我们for一遍就好. 坑点就是会爆int #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; ...

  3. POIUtil

    package com.util.poi; import java.io.ByteArrayOutputStream; import java.io.IOException; import java. ...

  4. 27.移除元素(c++方法实现)

    问题描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...

  5. go自动补全

    安装: get -u github.com/posener/complete/gocomplete gocomplete -install 卸载: gocomplete -uninstall http ...

  6. 微信小程序- 提示不在以下合法域名列表中

    第一次开发微信小程序时在访问后台数据时总是提示 提示上面问题主要有两个原因: 1.为配置安全合法域名列表: 微信小程序在开发时需要在官网配置固定的数据来源网站: 登录小程序平台中->设置: 图中 ...

  7. 利用python制作在Linux服务器后台定时运行的任务-邮件提醒

    1. 自动任务的功能为: 定时扫描数据库中的记录,然后发邮件 代码如下 scheduleMail.py import pymysql import smtplib from email.mime.te ...

  8. ubuntu 安装JDK1.6(jdk-6u45-linux-x64.bin)

    ubuntu 安装JDK1.6 首先在官网下载JKD1.6 linux的版本:http://www.oracle.com/technetwork/java/javasebusiness/downloa ...

  9. 源码版本管理工具 :TFS GIT

    至于svn  ..忽略不计了... 集中式代码管理 CVCS 模式:TFS 分布式代码管理 DVCS 模式:git 两者比较大的差别:tfs 只有一个中央仓储,其他副本都要与中央仓储进行更新.git  ...

  10. Innotop的安装和使用

    功能特点1.显示当前innodb的全部事务列表:2.显示当前正运行着的查询:3.显示当前锁和锁等等的列表:4.服务器状态和变量的摘要信息 显示了数值的相对变化幅度:5.有多种模式可用来显示Innodb ...