Rust 语言 编写简易计算器 支持加减乘除与括号运算

Rust阿木 发布于 5 天前 5 次阅读


Rust语言简易计算器实现

计算器是计算机科学中最基础的工具之一,它能够帮助我们快速进行数学运算。在Rust语言中,我们可以通过实现一个简易的计算器来学习Rust的基本语法和特性。本文将围绕Rust语言,编写一个支持加减乘除与括号运算的简易计算器。

Rust语言简介

Rust是一种系统编程语言,它旨在提供内存安全、并发支持和高性能。Rust的设计目标是防止内存泄漏、空指针解引用和其他常见的编程错误。Rust的语法简洁,同时提供了丰富的标准库和工具链。

计算器设计思路

在实现计算器之前,我们需要明确几个关键点:

1. 表达式解析:将用户输入的字符串表达式解析成内部表示形式,如抽象语法树(AST)。
2. 运算符优先级:正确处理不同运算符的优先级,如先乘除后加减。
3. 括号处理:正确处理括号内的运算,确保括号内的表达式先被计算。
4. 错误处理:处理用户输入错误,如非法字符、不匹配的括号等。

实现代码

以下是一个简易计算器的Rust实现,它支持加减乘除和括号运算。

rust
use std::collections::VecDeque;

[derive(Debug, PartialEq)]
enum Token {
Number(f64),
Operator(char),
LeftParen,
RightParen,
}

fn tokenize(expression: &str) -> VecDeque {
let mut tokens = VecDeque::new();
let mut number = String::new();

for c in expression.chars() {
match c {
' ' => continue,
'0'..='9' | '.' => number.push(c),
'+' | '-' | '' | '/' | '(' | ')' => {
if !number.is_empty() {
tokens.push_back(Token::Number(number.parse().unwrap()));
number.clear();
}
tokens.push_back(Token::Operator(c));
}
_ => panic!("Invalid character: {}", c),
}
}

if !number.is_empty() {
tokens.push_back(Token::Number(number.parse().unwrap()));
}

tokens
}

fn apply_operator(operators: &mut VecDeque, values: &mut VecDeque) {
let operator = operators.pop_back().unwrap();
let right = values.pop_back().unwrap();
let left = values.pop_back().unwrap();

match operator {
Token::Operator('+') => values.push_back(left + right),
Token::Operator('-') => values.push_back(left - right),
Token::Operator('') => values.push_back(left right),
Token::Operator('/') => {
if right == 0.0 {
panic!("Division by zero");
}
values.push_back(left / right);
}
_ => panic!("Invalid operator"),
}
}

fn evaluate(tokens: VecDeque) -> f64 {
let mut operators = VecDeque::new();
let mut values = VecDeque::new();

for token in tokens {
match token {
Token::Number(n) => values.push_back(n),
Token::Operator(op) => {
while let Some(&Token::Operator(ref o)) = operators.back() {
if o == '(' || o == ')' {
break;
}
if let Some(&Token::Number(ref n)) = values.back() {
apply_operator(&mut operators, &mut values);
}
}
operators.push_back(Token::Operator(op));
}
Token::LeftParen => operators.push_back(Token::LeftParen),
Token::RightParen => {
while let Some(&Token::Operator(ref o)) = operators.back() {
if o == '(' {
operators.pop_back();
break;
}
if let Some(&Token::Number(ref n)) = values.back() {
apply_operator(&mut operators, &mut values);
}
}
}
}
}

while let Some(&Token::Operator(ref o)) = operators.back() {
if o == '(' || o == ')' {
operators.pop_back();
break;
}
if let Some(&Token::Number(ref n)) = values.back() {
apply_operator(&mut operators, &mut values);
}
}

values.pop_back().unwrap()
}

fn main() {
let expression = "3 + (2 4) - 1 / (5 - 2)";
let tokens = tokenize(expression);
let result = evaluate(tokens);
println!("Result: {}", result);
}

代码解析

1. Token枚举:定义了四种类型的Token,包括数字、运算符、左右括号。
2. tokenize函数:将输入的字符串表达式转换成Token序列。
3. apply_operator函数:应用运算符到两个数值上。
4. evaluate函数:计算Token序列的结果。
5. main函数:主函数,读取用户输入的表达式,进行解析和计算,并打印结果。

总结

本文使用Rust语言实现了一个简易的计算器,支持加减乘除和括号运算。通过这个例子,我们可以学习到Rust的基本语法、错误处理和表达式解析等知识。在实际应用中,计算器的实现可以更加复杂,例如支持更丰富的运算符、错误提示、用户界面等。