表达式计算器
2018-06-17 21:26:44来源:未知 阅读 ()
工作一段时间了,第一次写博客,只是记录一些平时写的练习代码。这次是记录一个练习Stack的例子,代码写的有点乱,以后慢慢优化吧。
第一次写,写的不好还请多多指教。
思路:遍历字符串,遇到操作符,就把数字入栈。遇到 * 或 / ,如果下一个是数字,就出栈前一个数字,计算结果后再入栈,如果是 + 或 - ,计算之前的结果后入栈。
一个栈处理的有点乱,有时间会继续优化。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 5 namespace CountDLL 6 { 7 public class FormulaCount 8 { 9 /// <summary> 10 /// 暂时只计算简单的加减乘除和括号 11 /// </summary> 12 /// <param name="Formula"></param> 13 /// <returns></returns> 14 public static double GetResult(string Formula) 15 { 16 char[] chars = { '+', '-', '*', '/', '(', ')' }; 17 char[] chars1 = { '*', '/' }; 18 char[] chars2 = { '+', '-' };//遇到这些符号就计算之前的结果,把计算结果入栈 19 20 string[] str_arr = Formula.Split(chars, StringSplitOptions.RemoveEmptyEntries); 21 22 Stack<string> stack_char = new Stack<string>(); 23 24 string num = ""; 25 double d_pre = 0.0; 26 double d_next = 0.0; 27 double d_result = 0.0; 28 29 char c = '0'; 30 31 int length = Formula.Length; 32 for (int i = 0; i <= length; i++) 33 { 34 if (i < length) 35 { 36 char s = Formula[i]; 37 if (chars.Contains(s)) 38 { 39 if (s == '(') 40 { 41 if (c != '0') 42 { 43 stack_char.Push(c.ToString()); 44 } 45 stack_char.Push(s.ToString()); 46 num = ""; 47 c = '0'; 48 continue; 49 } 50 51 if (chars1.Contains(c)) 52 { 53 d_pre = Convert.ToDouble(stack_char.Pop()); 54 55 d_next = Convert.ToDouble(num); 56 57 if (c == '/' && d_next == 0.0) 58 { 59 throw new Exception("被除数为0"); 60 } 61 d_result = Count(d_pre, d_next, c); 62 63 d_pre = d_result; 64 65 stack_char.Push(d_result.ToString()); 66 num = ""; 67 c = '0'; 68 } 69 70 if (num != "") 71 { 72 stack_char.Push(num); 73 d_pre = 0.0; 74 num = ""; 75 } 76 77 if (chars1.Contains(s))//乘除直接计算 78 { 79 c = s; 80 continue; 81 } 82 else if (chars2.Contains(s))//遇到加减,计算这个符号前面的结果 83 { 84 if (stack_char.Count >= 3) 85 { 86 d_next = Convert.ToDouble(stack_char.Pop()); 87 char c1 = stack_char.Pop()[0]; 88 if (c1 == '(') 89 { 90 stack_char.Push(c1.ToString()); 91 stack_char.Push(d_next.ToString()); 92 stack_char.Push(s.ToString()); 93 continue; 94 } 95 96 d_pre = Convert.ToDouble(stack_char.Pop()); 97 98 d_result = Count(d_pre, d_next, c1); 99 100 stack_char.Push(d_result.ToString()); 101 } 102 stack_char.Push(s.ToString()); 103 } 104 else if (s == ')') 105 { 106 d_next = Convert.ToDouble(stack_char.Pop()); 107 char c1 = stack_char.Pop()[0]; 108 while (c1 != '(') 109 { 110 d_pre = Convert.ToDouble(stack_char.Pop()); 111 112 d_next = Count(d_pre, d_next, c1); 113 c1 = stack_char.Pop()[0]; 114 } 115 stack_char.Push(d_next.ToString()); 116 } 117 } 118 else 119 { 120 num += s; 121 d_pre = 0.0; 122 } 123 } 124 else 125 { 126 if (!string.IsNullOrEmpty(num)) 127 { 128 d_next = Convert.ToDouble(num); 129 } 130 else 131 { 132 d_next = Convert.ToDouble(stack_char.Pop()); 133 } 134 while (stack_char.Count >= 2) 135 { 136 char c1 = stack_char.Pop()[0]; 137 d_pre = Convert.ToDouble(stack_char.Pop()); 138 139 d_next = Count(d_pre, d_next, c1); 140 } 141 stack_char.Push(d_next.ToString()); 142 } 143 } 144 145 return Convert.ToDouble(stack_char.Pop()); 146 } 147 148 private static double Count(double d_pre, double d_next, char c) 149 { 150 double d_result = 0.0; 151 152 switch (c) 153 { 154 case '+': 155 d_result = d_pre + d_next; 156 break; 157 case '-': 158 d_result = d_pre - d_next; 159 break; 160 case '*': 161 d_result = d_pre * d_next; 162 break; 163 case '/': 164 d_result = d_pre / d_next; 165 break; 166 default: break; 167 } 168 169 return d_result; 170 } 171 } 172 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 了解php工作原理以及常用功能 2019-09-30
- 使用 Shell 在多服务器上批量操作 2019-09-23
- MySQL正则表达式的介绍 2019-09-23
- php并发加锁问题分析与设计,可深入学习 2019-08-29
- 一个在高并发下财务支付锁的问题分析 2019-08-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash