Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈。
主体思想就是将每次输入的字符和数字分别存储在两个栈中。每遇到一个单次结束符号(就是“)”),边将运算符号栈中的字符弹出一个,在将数字栈中的数字弹出两个,并进行运算,将最后的结果在压入数字栈中。在进行下次的运算。以此类推。
整体的算法思路比较清晰,但是算法的实现有一些地方不太如意,这些问题下面在说。下面粘贴代码。
import java.util.Scanner;
import java.util.Stack; public class demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); Stack<String> zf = new Stack<String>();// 存储字符串的栈
Stack<Double> sz = new Stack<Double>();// 存储数字的栈
while (sc.hasNext()) {
String s = sc.nextLine();
if (s.equals("(")) /* 不做操作 */
;
else if (s.equals("+"))
zf.push(s);
else if (s.equals("-"))
zf.push(s);
else if (s.equals("*"))
zf.push(s);
else if (s.equals("/"))
zf.push(s);
else if (s.equals("sqrt"))
zf.push(s);
else if (s.equals(")")) {
// 从栈中取出数据,字符串和数字
// pop移除堆栈顶部的对象,并作为此函数的值返回该对象。
String zf1 = zf.pop();
Double sz1 = sz.pop();
// 将取出的数据计算
if (zf1.equals("+"))
sz1 = sz.pop() + sz1;// 取出字符串,再进行比较。并取出数字进行相应的计算
else if (zf1.equals("-"))
sz1 = sz.pop() - sz1;
else if (zf1.equals("*"))
sz1 = sz.pop() * sz1;
else if (zf1.equals("/"))
sz1 = sz.pop() / sz1;
else if (zf1.equals("sqrt"))
sz1 = Math.sqrt(sz1);
// 再将数字放回去
sz.push(sz1); }
// else if(s.equals(" ")) System.out.println(sz.pop());
else {
//如果取出的字符既不是运算符,也不是括号。将这个字符作为数字压入栈中
sz.push(Double.parseDouble(s));
} }
// 按ctrl+z退出控制台输入
//此处输入还可以改进
System.out.println(sz.pop());
} }
要说改进的地方就是数据的输入方式,因为本人java学习不太精通,这里具体数据的实现还要写一个方法,不再这里叙述。只是说这个代码还要改进的地方。总体思路是对的。
Dijkstra的双栈算术表达式求值算法的更多相关文章
- Dijkstra的双栈算术表达式求值算法 C++实现
#include<iostream> #include<string> using namespace std; template<typename T> clas ...
- 算法手记(2)Dijkstra双栈算术表达式求值算法
这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...
- 栈的一个实例——Dijkstra的双栈算术表达式求值法
Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...
- 双栈算术表达式求值算法 栈(Stack) - Java实现
https://mp.weixin.qq.com/s/dg8mgd6CIQ7Tui1_fQwSBA https://github.com/toywei/DataStructure/tree/maste ...
- Dijkstra双栈算术表达式求值
在看algs4的时候偶然发现了这个算法,又回顾了一遍当时数据结构课程里讲过的知识,当时很不在意.迟早是要还的,哎 用python实现了,比较麻烦的是我现在没有解决bash传参的问题,''(" ...
- Dijkstra的双栈算术表达式的求值算法
例如需要计算 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ...
- [algorithm] Dijkstra双栈算法表达式求值算法
一.原理 Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数), 表达式由括号,运算符和操作数组成. (1).将操作数压入操作数栈 (2).将运算符压入运算符栈: ...
- page80-栈用例-算术表达式求值
表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
随机推荐
- IO查找文件复制到指定路径
public class IOTest { // 存储获取的文件绝对路径 private static List<String> list = new ArrayList<Strin ...
- ASP.NET部分代码示例
using System; using System.Collections.Generic; using Model; using System.Data; using System.Data.Sq ...
- ubuntu下cmake 使用clang
安装llvm.clang sudo apt-get install llvm clang clang命令会在/usr/bin/clang cmake配置交叉编译链 建立linux.toolchain. ...
- SpringMVC的工作流程以及组件说明
1. SpringMVC处理流程 2. SpringMVC架构 2.1 框架结构 2.2 框架流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherSer ...
- Java IO流简介
Java中的流是什么? java中的流是一个抽象的概念,在java的程序中需要把文件从一个设备传输到另一个设备上,这个设备可以是内存,程序,文件,网络.把在这些之间传输的叫做流.官方的解释:流是一组有 ...
- 笔记:XML-解析文档
要处理XML文档,就要先解析(parse)他,解析器时这样一个程序,读入一个文件,确认整个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素,Java库提供了两种XML解析器: 像 ...
- 用js编解码base64
以下是编码和解码的方法 function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef ...
- 设计模式 --> (5)适配器模式
适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作.比如说我的hp笔记本,美国产品,人家美国的电压是110V的,而我们中国的 ...
- Beta冲刺NO.1
Beta冲刺 第一天 1. 昨天的困难 由于今天还是第一天,所以暂时没有昨天的困难. 2. 今天解决的进度 潘伟靖: 对代码进行了review 1.将某些硬编码改为软编码 2.合并了一些方法,简化代码 ...
- C语言——第0次作业(二)
1.翻阅邹欣老师的关于师生关系博客,并回答下列问题,每个问题的答案不少于500字: 1.最理想的师生关系是健身教练和学员的关系,在这种师生关系中你期望获得来自老师的哪些帮助? 在现代软件工程讲义 0 ...