简单计算器的实现

川长思鸟来 2022-08-02 09:34 346阅读 0赞

计算器

问题描述: 输入一个简单四则运算表达式字符串,计算该表达式的值

注:
1、表达式只含 +, -, *, /, (, ), 四则运算符
2、表达式数值只包含整数(0-9),每个操作数可以是多位,且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如80/3=26。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

要求实现函数:
int calculate(int len,char *expStr)

【输入】 int len: 字符串长度; char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
• 示例
1) 输入:char *expStr = “-3*(-200)-(-3*(-5-2*10)/(4+3-17)*9)”

  1. 函数返回:663

2) 输入:char *expStr = “8/3*3”

  1. 函数返回:6
  2. #include "stdafx.h"
  3. #include<vector>
  4. #include<deque>
  5. #include<iostream>
  6. using namespace std;
  7. char*vec2char(vector<char>vec, char*str)
  8. {
  9. char*s = str;
  10. vector<char>::iterator it;
  11. it = vec.begin();
  12. while (it != vec.end())
  13. *(s++) = *(it++);
  14. *s = '\0';
  15. return str;
  16. }
  17. //计算不带括号的表达式的值
  18. int calculate_without_bracket(vector<char>&substr)
  19. {
  20. vector<char>::iterator it, it1, it2, iter;
  21. char*str = new char[100];
  22. it = substr.begin();
  23. while (it != substr.end())
  24. {
  25. deque<int>bb;
  26. deque<int>::iterator p;
  27. int aa;
  28. //因为每次去括号时,都会对多个“-”
  29. //号进行合并,这里不会出现多于两个“-”相连的情况
  30. if (*substr.begin() == '-')
  31. {
  32. if (*(substr.begin() + 1) == '-')
  33. {
  34. substr.erase(substr.begin(), substr.begin() + 2);
  35. it = substr.begin();
  36. }
  37. }
  38. if (*it == '*' || *it == '/')
  39. {
  40. bool flag1 = false;
  41. bool flag2 = false;
  42. int f1 = 0, f2 = 0;
  43. it1 = it - 1;
  44. int gg = 0;
  45. while (*it1 - '0' >= 0 && *it1 - '0' <= 9 && it1 - substr.begin() >= 0)
  46. {
  47. gg++;
  48. bb.push_front(*it1 - '0');
  49. if (it1 == substr.begin())
  50. break;
  51. it1--;
  52. }
  53. if (it1 != substr.begin())
  54. {
  55. if (*it1 == '-')
  56. {
  57. if (*(it1 - 1) == '-')
  58. if (it1 - 1 == substr.begin())
  59. {
  60. substr.erase(substr.begin(), substr.begin() + 2);
  61. it = substr.begin() + gg;
  62. it1 = substr.begin();
  63. }
  64. else
  65. {
  66. it1 = it1 - 2;
  67. substr.erase(it1 + 1, it1 + 3);
  68. substr.insert(it1 + 1, '+');
  69. it1 = it1 + 2;
  70. it = it1 + gg;
  71. }
  72. else if (*(it1 - 1) == '+')//这一次的乘除运算之前不可能出现别的“*”或“/”
  73. {
  74. it1 = it1 - 2;
  75. substr.erase(it1 + 1, it1 + 3);
  76. substr.insert(it1 + 1, '-');
  77. it1 = it1 + 2;
  78. it = it1 + gg;
  79. }
  80. else
  81. it1++;
  82. }
  83. }
  84. else if (it1 == substr.begin() && *it1 == '-')
  85. it1++;
  86. it2 = it + 1;
  87. if (*it2 == '-')
  88. {
  89. flag1 = true;
  90. it2++;
  91. }
  92. p = bb.begin();
  93. while (p != bb.end())
  94. {
  95. f1 = *p + 10 * f1;
  96. ++p;
  97. }
  98. while (it2 != substr.end() && *it2 - '0' >= 0 && *it2 - '0' <= 9)
  99. {
  100. f2 = 10 * f2 + (*it2 - '0');
  101. it2++;
  102. }
  103. if (*it == '*')
  104. aa = f1*f2;
  105. else
  106. aa = f1 / f2;
  107. if (flag1)
  108. aa = -aa;
  109. char*ss = new char[100];
  110. _itoa(aa, ss, 10);
  111. if (it1 == substr.begin())
  112. {
  113. int c = 0;
  114. substr.erase(it1, it2);
  115. while (*ss != '\0')
  116. {
  117. substr.insert(substr.begin() + c, *ss);
  118. ++ss;
  119. ++c;
  120. }
  121. it = substr.begin();
  122. }
  123. else
  124. {
  125. int c = 0;
  126. iter = it1 - 1;
  127. substr.erase(it1, it2);
  128. while (*ss != '\0')
  129. {
  130. substr.insert(iter + 1 + c, *ss);
  131. ++ss;
  132. ++c;
  133. }
  134. //substr.insert(iter + 1, aa+'0');
  135. it = iter + 1;
  136. }
  137. }
  138. else
  139. {
  140. it++;
  141. }
  142. //if (substr.size() == 1)
  143. // return (*substr.begin() - '0');
  144. }
  145. it = substr.begin();
  146. while (it != substr.end())
  147. {
  148. deque<int>bb;
  149. deque<int>::iterator p;
  150. int aa;
  151. if (*substr.begin() == '-')
  152. {
  153. if (*(substr.begin() + 1) == '-')
  154. {
  155. substr.erase(substr.begin(), substr.begin() + 2);
  156. }
  157. else
  158. {
  159. bool flag2 = false;
  160. int f1 = 0, f2 = 0;
  161. it1 = substr.begin() + 1;
  162. while (*it1 - '0' >= 0 && *it1 - '0' <= 9)
  163. {
  164. bb.push_back(*it1 - '0');
  165. it1++;
  166. if (it1 == substr.end())
  167. {
  168. char*src = new char[100];
  169. return atoi(vec2char(substr, src));
  170. }
  171. }
  172. p = bb.begin();
  173. while (p != bb.end())
  174. {
  175. f1 = *p + 10 * f1;
  176. ++p;
  177. }
  178. it = it1;
  179. it2 = it + 1;
  180. if (*it2 == '-')//因为每次去括号时,都会对多个“-”
  181. //号进行合并,这里不会出现多于两个“-”相连的情况
  182. {
  183. it2++;
  184. flag2 = true;
  185. }
  186. while (it2 != substr.end() && *it2 - '0' >= 0 && *it2 - '0' <= 9)
  187. {
  188. f2 = 10 * f2 + (*it2 - '0');
  189. it2++;
  190. }
  191. if (*it == '+')
  192. if (flag2)
  193. aa = -f1 - f2;
  194. else
  195. aa = -f1 + f2;
  196. else
  197. if (flag2)
  198. aa = -f1 + f2;
  199. else
  200. aa = -f1 - f2;
  201. char*ss = new char[100];
  202. _itoa(aa, ss, 10);
  203. int c = 0;
  204. substr.erase(substr.begin(), it2);
  205. while (*ss != '\0')
  206. {
  207. substr.insert(substr.begin() + c, *ss);
  208. ++ss;
  209. ++c;
  210. }
  211. //substr.insert(substr.begin(), aa + '0');
  212. it = substr.begin();
  213. }
  214. }
  215. else if
  216. //因为每次都是从左到右一次只计算两个数,除了第一个符号是“-”外,另一种
  217. //情况下第一个操作数一定是正数,只需考虑第二个操作数的符号
  218. (*it == '+' || *it == '-')
  219. {
  220. bool flag1 = false;
  221. int f1 = 0, f2 = 0;
  222. it1 = it - 1;
  223. it2 = it + 1;
  224. if (*it2 == '-')
  225. {
  226. flag1 = true;
  227. it2++;
  228. }
  229. while (*it1 - '0' >= 0 && *it1 - '0' <= 9 && it1 - substr.begin() >= 0)
  230. {
  231. bb.push_front(*it1 - '0');
  232. if (it1 == substr.begin())
  233. break;
  234. it1--;
  235. }
  236. if (it1 != substr.begin())
  237. it1++;
  238. p = bb.begin();
  239. while (p != bb.end())
  240. {
  241. f1 = *p + 10 * f1;
  242. ++p;
  243. }
  244. while (it2 != substr.end() && *it2 - '0' >= 0 && *it2 - '0' <= 9)
  245. {
  246. f2 = 10 * f2 + (*it2 - '0');
  247. it2++;
  248. }
  249. if (*it == '+')
  250. if (flag1)
  251. aa = f1 - f2;
  252. else
  253. aa = f1 + f2;
  254. else
  255. if (flag1)
  256. aa = f1 + f2;
  257. else
  258. aa = f1 - f2;
  259. char*ss = new char[100];
  260. _itoa(aa, ss, 10);
  261. if (it1 == substr.begin())
  262. {
  263. int c = 0;
  264. substr.erase(it1, it2);
  265. while (*ss != '\0')
  266. {
  267. substr.insert(substr.begin() + c, *ss);
  268. ++ss;
  269. ++c;
  270. }
  271. //substr.insert(substr.begin(), aa + '0');
  272. it = substr.begin();
  273. }
  274. else
  275. {
  276. //iter = it - 2;
  277. //substr.erase(it - 1, it + 2);
  278. //substr.insert(iter + 1, aa + '0');
  279. //it = iter + 1;
  280. int c = 0;
  281. iter = it1 - 1;
  282. substr.erase(it1, it2);
  283. while (*ss != '\0')
  284. {
  285. substr.insert(iter + 1 + c, *ss);
  286. ++ss;
  287. ++c;
  288. }
  289. it = iter + 1;
  290. }
  291. }
  292. else
  293. {
  294. it++;
  295. }
  296. }
  297. return atoi(vec2char(substr, str));
  298. }
  299. //去括号,每次找到第一对连续匹配的括号,然后用calculate_without_bracket函数
  300. //计算括号里的表达式的值,计算后的结果插入原表达式,返回true。
  301. //如果原表达式没有括号,返回false
  302. bool erase_bracket(vector<char>&str)
  303. {
  304. int size = str.size();
  305. bool flag = false;
  306. int k = 0;
  307. int m, n;
  308. vector<char>::iterator it, it1, it2;
  309. it = str.begin();
  310. while (k < size)
  311. {
  312. if (str[k] == '(')
  313. {
  314. m = k;
  315. k++;
  316. while (str[k] != '('&&str[k] != ')')
  317. k++;
  318. if (str[k] == ')')
  319. {
  320. n = k;
  321. flag = true;
  322. break;
  323. }
  324. else if (str[k] == '(')
  325. {
  326. k--;
  327. }
  328. }
  329. else
  330. {
  331. k++;
  332. }
  333. }
  334. if (flag)
  335. {
  336. vector<char>sub;
  337. for (int i = m+1; i < n ; i++)
  338. sub.push_back(str[i]);
  339. calculate_without_bracket(sub);
  340. it = it + m - 1;
  341. for (int i = 0; i < n + 1 - m;i++)
  342. str.erase(it + 1, (it + 2 ));
  343. int k = 0;
  344. int len = sub.size();
  345. while (k < len)
  346. {
  347. str.insert(it + k + 1, sub[k]);
  348. k++;
  349. }
  350. }
  351. return flag;
  352. }
  353. /*vector<char>char2vec(vector<char>&vec, char*str)
  354. {
  355. while (*str != '\0')
  356. {
  357. vec.push_back(*str);
  358. ++str;
  359. }
  360. return vec;
  361. }*/
  362. //整体表达式计算函数,每次调用erase_bracket函数先计算括号里的值
  363. //直到消除所有的括号,最后调用calculate_without_bracket计算剩下的无括号表达式的值
  364. int calculate(int len, char *expStr)
  365. {
  366. vector<char>str;
  367. for (int i = 0; i < len; i++)
  368. str.push_back(expStr[i]);
  369. bool flag = true;
  370. while (flag)
  371. {
  372. flag = erase_bracket(str);
  373. }
  374. return calculate_without_bracket(str);
  375. }
  376. int _tmain(int argc, _TCHAR* argv[])
  377. {
  378. /*vector<int>aa;
  379. vector<int>::iterator it,ite;
  380. for (int i = 0; i < 5; i++)
  381. aa.push_back(i);
  382. it = aa.begin()+3;
  383. ite = it -2;
  384. aa.erase(it-1,it+1);
  385. aa.insert(ite+1, 9);*/
  386. vector<char>vec;
  387. //char2vec(vec, "2+10-30-2*9/4+3-7*9");
  388. //cout << calculate_without_bracket(vec) << endl;
  389. //int len=strlen("2+(5-14-2)*9/(4+3-17)*9");
  390. int len = strlen("-3*(-200)-(-3*(-5-2*10)/(4+3-17)*9)");
  391. cout << calculate(len, "-3*(-200)-(-3*(-5-2*10)/(4+3-17)*9)");
  392. system("pause");
  393. return 0;
  394. }

发表评论

表情:
评论列表 (有 0 条评论,346人围观)

还没有评论,来说两句吧...

相关阅读