Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.96 KB | None | 0 0
  1. use std::process::exit;
  2. use std::cell::RefCell;
  3.  
  4. struct Calculator {
  5. numbers: RefCell<Vec<f64>>,
  6. operator: RefCell<Vec<u8>>,
  7. expression: String,
  8. }
  9.  
  10. trait CalculatorErrorConv {
  11. type Output;
  12. fn mark_number_error(self) -> Self::Output;
  13. }
  14.  
  15. impl<E> CalculatorErrorConv for Result<f64, E> {
  16. type Output = Result<f64, String>;
  17.  
  18. fn mark_number_error(self) -> Self::Output {
  19. match self {
  20. Ok(v) => Ok(v),
  21. Err(e) => Err("Invalid number".to_string()),
  22. }
  23. }
  24. }
  25.  
  26.  
  27. impl Calculator {
  28. pub fn new(expr: String) -> Self {
  29. Calculator {
  30. numbers: RefCell::new(Vec::new()),
  31. operator: RefCell::new(Vec::new()),
  32. expression: expr,
  33. }
  34. }
  35.  
  36. pub fn run(&self) -> Result<f64, String> {
  37.  
  38. let mut sign: u8 = 0; //入栈签名
  39. let mut vernier: u8 = 0; //移动游标
  40. let mut locat: usize = 0; //切片定位
  41. let mut bracket: u32 = 0; //括号标记
  42. let expr = &self.expression;
  43. let bytes = self.expression.as_bytes();
  44. const PI: f64 = 3.141592653589793;
  45.  
  46. let priority = |x: &u8| -> u8 {
  47. match x {
  48. b'+' | b'-' => 1,
  49. b'*' | b'/' | b'%' => 2,
  50. b'^' => 3,
  51. _ => exit(0),
  52. }
  53. };
  54.  
  55. let computing = |x: &u8| -> Result<f64, String> {
  56. match x {
  57. b'+' => {
  58. let c1 = self.numbers.borrow_mut().pop().unwrap();
  59. let c2 = self.numbers.borrow_mut().pop().unwrap();
  60. return Ok(c2 + c1);
  61. }
  62.  
  63. b'-' => {
  64. let c1 = self.numbers.borrow_mut().pop().unwrap();
  65. let c2 = self.numbers.borrow_mut().pop().unwrap();
  66. return Ok(c2 - c1);
  67. }
  68.  
  69. b'*' => {
  70. let c1 = self.numbers.borrow_mut().pop().unwrap();
  71. let c2 = self.numbers.borrow_mut().pop().unwrap();
  72. return Ok(c2 * c1);
  73. }
  74.  
  75. b'/' => {
  76. let c1 = self.numbers.borrow_mut().pop().unwrap();
  77. let c2 = self.numbers.borrow_mut().pop().unwrap();
  78. if c1 == 0.0 {
  79. return Err("Divide By Zero".to_string());
  80. }
  81. return Ok(c2 / c1);
  82. }
  83.  
  84. b'%' => {
  85. let c1 = self.numbers.borrow_mut().pop().unwrap();
  86. let c2 = self.numbers.borrow_mut().pop().unwrap();
  87. if c1 == 0.0 {
  88. return Err("Divide By Zero".to_string());
  89. }
  90. return Ok(c2 % c1);
  91. }
  92.  
  93. b'^' => {
  94. let c1 = self.numbers.borrow_mut().pop().unwrap();
  95. let c2 = self.numbers.borrow_mut().pop().unwrap();
  96. return Ok(c2.powf(c1));
  97. }
  98.  
  99. _ => exit(0),
  100. }
  101. };
  102.  
  103. for (index, &value) in bytes.iter().enumerate() {
  104. match value {
  105. b'0' ..= b'9' | b'.' => {
  106. if vernier != b')' { //数字前是右括号,则表达式错误。
  107. vernier = b'A';
  108. continue
  109. }
  110. return Err("Expression Error".to_string());
  111. }
  112.  
  113. ch @ b'+' | ch @ b'-' | ch @ b'*' | ch @ b'/' | ch @ b'%' | ch @ b'^' => {
  114.  
  115. let negative1 = ch == b'-' && vernier == b'(' && vernier != b'A';
  116. let negative2 = ch == b'-' && vernier != b')' && vernier != b'A' && vernier != b'-';
  117.  
  118. if negative1 == true || negative2 == true { //检查是减号还是负号
  119. vernier = b'-';
  120. continue
  121. }else if vernier != b'A' && vernier != b')' { //运算符前面是非数字、非右括号,则表达式错误。
  122. return Err("Expression Error".to_string());
  123. }
  124.  
  125. vernier = b'B';
  126.  
  127. if sign != b'A' {
  128. match expr[locat..index].parse::<f64>() { //将运算符前的数字取出来
  129. Ok(value) => {
  130. self.numbers.borrow_mut().push(value); //读取的数字进栈
  131. sign = b'A';
  132. }
  133. Err(_) => return Err("Invalid number".to_string()),
  134. }
  135. }
  136.  
  137. while self.operator.borrow().len() != 0 && self.operator.borrow().last().unwrap() != &b'(' {
  138. let p1 = priority(self.operator.borrow().last().unwrap());
  139. let p2 = priority(&ch);
  140. if p1 >= p2 { //优先级比较
  141. let res = computing(self.operator.borrow().last().unwrap()); //调用二元运算函数
  142. match res {
  143. Ok(_) => {
  144. self.numbers.borrow_mut().push(res.unwrap()); //运算结果进栈
  145. self.operator.borrow_mut().pop(); //运算符出栈
  146. }
  147. Err(_) => return res,
  148. }
  149. } else {
  150. break
  151. }
  152. }
  153.  
  154. self.operator.borrow_mut().push(ch); //运算符进栈
  155. locat = index + 1; //移动切片定位
  156. sign = b'B';
  157. continue
  158. }
  159.  
  160. ch @ b'(' => {
  161. if sign != b'A' && vernier != b'A' && vernier != b'-' { //左括号前如果是数字或负号,则表达式错误。
  162. self.operator.borrow_mut().push(ch); //左括号直接进栈
  163. locat = index + 1; //移动切片定位
  164. bracket = bracket + 1;
  165. vernier = b'(';
  166. continue
  167. }
  168. return Err("Expression Error".to_string());
  169. }
  170.  
  171. b')' => {
  172. if sign != b'A' && vernier == b'A' { //上一次进栈是运算符,同时括号前必须是数字。
  173. let value = expr[locat..index].parse::<f64>().mark_number_error()?;
  174. self.numbers.borrow_mut().push(value); //读取的数字进栈
  175. sign = b'A';
  176. }
  177.  
  178. vernier = b')';
  179.  
  180. if bracket > 0 && sign == b'A' { //运算符栈中必须有左括号,右括号前必须是数字。
  181. while self.operator.borrow().last().unwrap() != &b'(' { //遇到左括号时停止循环
  182. let res = computing(&self.operator.borrow_mut().pop().unwrap()); //调用二元运算函数
  183. match res {
  184. Ok(_) => self.numbers.borrow_mut().push(res.unwrap()), //运算结果进栈
  185. Err(_) => return res,
  186. }
  187. }
  188.  
  189. self.operator.borrow_mut().pop(); //左括号出栈
  190. locat = index + 1; //移动切片定位
  191. bracket = bracket - 1;
  192. continue
  193. }
  194.  
  195. return Err("Expression Error".to_string());
  196. }
  197.  
  198. b'=' => {
  199. if bracket > 0 || vernier == b'-' || vernier == b'B' { //等号前还有左括号、负号、运算符,则表达式错误。
  200. return Err("Expression Error".to_string());
  201. }
  202.  
  203. if sign != b'A' {
  204. match expr[locat..index].parse::<f64>() { //将运算符前的数字取出来
  205. Ok(value) => {
  206. self.numbers.borrow_mut().push(value); //读取的数字进栈
  207. sign = b'A';
  208. }
  209. Err(_) => return Err("Invalid number".to_string()),
  210. }
  211. }
  212.  
  213. while self.operator.borrow().len() != 0 { //直到运算符栈为空停止循环
  214. let res = computing(&self.operator.borrow_mut().pop().unwrap()); //调用二元运算函数
  215. match res {
  216. Ok(_) => self.numbers.borrow_mut().push(res.unwrap()), //运算结果进栈
  217. Err(_) => return res,
  218. }
  219. }
  220.  
  221. let res = self.numbers.borrow_mut().pop().unwrap(); //清空最后一个数据栈
  222. return Ok(res);
  223. }
  224.  
  225. b'A' => {
  226. vernier = b'A';
  227. if sign != b'A' {
  228. match expr[locat..index].parse::<f64>() { //将运算符前的数字取出来
  229. Ok(value) => {
  230. self.numbers.borrow_mut().push(value); //读取的数字进栈
  231. sign = b'A';
  232. }
  233. Err(_) => return Err("Invalid number".to_string()),
  234. }
  235. }
  236.  
  237. if sign == b'A' {
  238. let res = self.numbers.borrow_mut().pop().unwrap();
  239. self.numbers.borrow_mut().push(res.abs()); //Abs(X) X的绝对值
  240. locat = index + 1; //移动切片定位
  241. continue
  242. }
  243.  
  244. return Err("Expression Error".to_string());
  245. }
  246.  
  247. b'S' => {
  248. vernier = b'A';
  249. if sign != b'A' {
  250. match expr[locat..index].parse::<f64>() { //将运算符前的数字取出来
  251. Ok(value) => {
  252. self.numbers.borrow_mut().push(value); //读取的数字进栈
  253. sign = b'A';
  254. }
  255. Err(_) => return Err("Invalid number".to_string()),
  256. }
  257. }
  258.  
  259. if sign == b'A' {
  260. let res = self.numbers.borrow_mut().pop().unwrap();
  261. if res >= 0.0 {
  262. self.numbers.borrow_mut().push(res.sqrt()); //Sqrt(X) X的平方根
  263. locat = index + 1; //移动切片定位
  264. continue
  265. }
  266. return Err("Expression Error".to_string());
  267. }
  268. return Err("Expression Error".to_string());
  269. }
  270.  
  271. b'P' => {
  272. vernier = b'A';
  273. if sign != b'A' { //标记符前面必须是字符或者为空
  274. self.numbers.borrow_mut().push(PI); //Pi常量进入数字栈
  275. locat = index + 1; //移动切片定位
  276. sign = b'A';
  277. continue
  278. }
  279. return Err("Expression Error".to_string());
  280. }
  281.  
  282. _ => return Err("Operator Error".to_string()),
  283. }
  284. }
  285. Err("Possible Error".to_string())
  286. }
  287. }
  288.  
  289. fn main() {
  290. // 四则混合运算(用法实例): '^'为乘方运算符 . '%'为求模运算符
  291. // 函数混合运算(用法实例): "A=ABS" . "S=SQRT" . "P=PI"('P'被直接视为数字)
  292. let test1 = Calculator::new(String::from("0.1+0.2="));
  293. match test1.run() {
  294. Ok(value) => println!("{}", value),
  295. Err(msg) => println!("Error: {}", msg),
  296. }
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement