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 算法
24KB
421 行
Rustyard
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许可证。