栈练习--Dijkstra的双栈算术表达式求值算法

此法还有待完善,比如在做除法运算时未判断除数是否为0,而且也可以加以扩展,比如log、sin、操作符优先级。。

 1 public class Evaluate {
 2
 3     public static void main(String[] args) {
 4         String steam = "( 1 + ( 2 + 3 ) * ( 4 * 5 ) ) )";
 5 //        String steam = "( ( 1 + sqrt ( 5.0 ) ) / 2.0 )";
 6         Stack<String> ops = new Stack<String>();
 7         Stack<Double> vals = new Stack<Double>();
 8
 9         String[] steams = steam.split(" ");
10
11         for(int i=0; i<steams.length; i++) {
12             //读取字符,如果是运算符就压入栈
13             String s = steams[i];
14             /*char item = steam.charAt(i);
15             String s = String.valueOf(item);*/
16
17
18             if(s.equals("(")) {
19                 ;
20             }else if(s.equals("+")) {
21                 ops.push(s);
22             }else if(s.equals("-")) {
23                 ops.push(s);
24             }else if(s.equals("*")) {
25                 ops.push(s);
26             }else if(s.equals("/")) {
27                 ops.push(s);
28             }else if(s.equals("sqrt")) {
29                 ops.push(s);
30             }else if(s.equals(")")) {
31                 //如果字符为“)”则弹出运算符和操作数,计算结果并压入栈
32                 String op = ops.pop();
33                 double v = vals.pop();
34                 if(op.equals("+")) {
35                     v = vals.pop() + v;
36                 }else if(op.equals("-")) {
37                     v = vals.pop() - v;
38                 }else if(op.equals("*")) {
39                     v = vals.pop() * v;
40                 }else if(op.equals("/")) {
41                     v = vals.pop() / v;
42                 }else if(op.equals("sqrt")) {
43                     v = Math.sqrt(v);
44                 }
45                 vals.push(v);
46             }else {
47                 //如果字符既非运算符也不是括号,将它作为double值压入栈
48                 vals.push(Double.parseDouble(s));
49             }
50         }
51         System.out.println(vals.pop());
52     }
53 }

原文地址:https://www.cnblogs.com/zhaohuan1996/p/8385984.html

时间: 2024-08-02 06:36:51

栈练习--Dijkstra的双栈算术表达式求值算法的相关文章

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

这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了了解这个过程,我们可以自行搭建一套简易的算术表达式处理机制,这里就用到栈特性和本篇提到的Dijkstra算法. 概述:     算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地

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

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 template<typename T> 6 class Stack 7 { 8 private: 9 T stack[100]; 10 int i = 0; 11 public: 12 Stack() = default; 13 14 T pop() 15 { 16 if (i == -1) 17 { 18 cout <<

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

1 public static double evaluate(String inStr) { 2 Stack<String> ops = new Stack<String>(); //操作符栈 3 Stack<Double> vals = new Stack<Double>(); //操作数栈 4 char[] arr = inStr.toCharArray(); 5 for(char c : arr){ 6 String s =c+""

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

表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时, 弹出一个运算符,弹出所需数量的操作符,并将运算符和操作符的运算结果压入操作数栈. [地杰斯特拉的双栈算术表达式求值算法] public class Evaluate { public static void main(String[] args) { Stack<String> ops = n

Dijkstra的双栈算术表达式求值

import java.util.Stack; import java.util.Scanner; public class Evaluate { public static void main(String[] args) { Stack<String> ops=new Stack<String>(); Stack<Double> vals=new Stack<Double>(); Scanner cin=new Scanner(System.in); /

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可

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

算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3加上2,取它们的积然后加上1,就得到了101.但Java系统是如何完成这些运算的呢?不需要研究Java系统的构造细节,我们也可以编写一个Java程序来解决这个问题.它接受一个输入字符串(表达式)并输出表达式的值.为了简化问题,首先来看一下这份明确的递归定义:算术表达式可能是一个数,或者是由一个左括号

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

简单算术表达式求值

#include <stdio.h> #include <string.h> int main() { int n,i; char a[200]; int f=0,l=0; gets(a); for(i=0;i<strlen(a);i++) { if(a[i]>='0'&&a[i]<='9')//如果是数字 { if(a[i+1]>='0'&&a[i+1]<='9')//如果后面那个也是数字 { f=(f+a[i]-48