#math-expressions #math #calculator #expression #calculate #floating-point #shunting-yard

rustyard

A Shunting Yard算法实现和计算器。这个crate能够计算传入的基本数学表达式字符串,并返回64位浮点数结果。

5个版本 (重大更新)

使用旧版Rust 2015

0.6.0 2016年3月28日
0.5.0 2016年3月11日
0.3.0 2016年2月7日
0.2.0 2016年2月4日
0.1.0 2016年1月31日

#1163 in 算法

MIT许可协议

24KB
421

Rustyard alt text

Shunting Yard算法,用Rust实现。

代码

这是我在尝试使用Rust(我非常喜欢它)。因此,代码质量可能值得怀疑,并不完全是100%符合Rust风格的。

使用代码

您可以使用表达式实例化一个ShuntingYard对象,并调用它的calculate方法,该方法返回一个Result<f64, Vec<String>>。例如:

extern crate rustyard;

fn main() {
    let mut yard = rustyard::ShuntingYard::new();

    // This prints "The result is: 14"
    println!("The result is: {}", yard.calculate("2 + 4 * 3").unwrap());
}

示例

该实现接受4种基本数学运算符(幂运算符、括号和几个内置数学函数)。它还将所有输入视为浮点数。以下是一些示例:

基本加法

Simon$ cargo run --example main "2 + 4"
Input is: 2 + 4
Lexer result: 2 + 4 
Shunting Yard result: 2 4 + 
Equation equals: 6

浮点数

Simon$ cargo run --example main "1.75 * 2"
Input is: 1.75 * 2
Lexer result: 1.75 * 2 
Shunting Yard result: 1.75 2 * 
Equation equals: 3.5

运算符优先级

Simon$ cargo run --example main "2 + 4 * 3"
Input is: 2 + 4 * 3
Lexer result: 2 + 4 * 3 
Shunting Yard result: 2 4 3 * + 
Equation equals: 14

负数

Simon$ cargo run --example main "-2 * -2"
Input is: -2 * -2
Lexer result: -2 * -2
Shunting Yard result: -2 -2 *
Equation equals: 4

幂运算

Simon$ cargo run --example main "(3 + 5) ^ 2"
Input is: (3 + 5) ^ 2
Lexer result: ( 3 + 5 ) ^ 2 
Shunting Yard result: 3 5 + 2 ^ 
Equation equals: 64

括号

Simon$ cargo run --example main "(2 + 4) * 3"
Input is: (2 + 4) * 3
Lexer result: ( 2 + 4 ) * 3 
Shunting Yard result: 2 4 + 3 * 
Equation equals: 18

错误

Simon$ cargo run --example main "4 / (2 + 3"
Input is: 4 / (2 + 3
Errors:
ERR: Unbalanced parenthesis
Simon$ cargo run --example main "a + b * c"
Input is: a + b * c
Errors:
ERR: Unknown identifier: a
ERR: Unknown identifier: b
ERR: Unknown identifier: c

函数

Simon$ cargo run --example main "sqrt(9) + 10 + max(10, 50)"
Input is: sqrt(9) + 10 + max(10, 50)
Lexer result: sqrt ( 9 ) + 10 + max ( 10 , 50 ) 
Shunting Yard result: 9 sqrt 10 + 10 50 max + 
Equation equals: 63

内置函数

  • round(n) - 向上舍入,截断值为.5。
  • trunc(n) - 返回数字的整数部分(1.44 -> 1.00)。
  • fract(n) - 返回数字的小数部分(1.44 -> 0.44)。
  • pow(n, e) - 将n提升到e的幂。
  • sqrt(n) - 返回n的平方根。
  • max(n, m) - 返回n和m中的较大值。
  • min(n, m) - 返回n和m中的较小值。
  • cos(n)
  • sin(n)
  • 正切(n)
  • 向下取整(n)
  • 向上取整(n)

许可证

我已经决定为这个存储库使用MIT许可证。

无运行时依赖