用栈实现计算器

用到了中缀转后缀以及后缀表达式的计算

直接贴代码~:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include "Calculator.h"

  4. //构造函数
  5. Calculator::Calculator()
  6. {
  7. m = new char[100];
  8. }

  9. //析构
  10. Calculator::~Calculator()
  11. {
  12. }
  13. //判断是不是数字
  14. bool Calculator::isnum(char a)
  15. {
  16. if ((a >= '0') && (a <= '9'))
  17. return true;
  18. else
  19. return false;
  20. }
  21. //判断是不是左括号
  22. bool Calculator::isleft(char a)
  23. {
  24. if ((a == '('))
  25. return true;
  26. else
  27. return false;
  28. }
  29. //判断是不是右括号
  30. bool Calculator::isright(char a)
  31. {
  32. if ((a == ')'))
  33. return true;
  34. else
  35. return false;
  36. }
  37. //判断是不是符号
  38. bool Calculator::isOperator(char a)
  39. {
  40. if ((a == '+') || (a == '-') || (a == '*') || (a == '/'))
  41. return true;
  42. else
  43. return false;
  44. }
  45. //比较符号的优先级
  46. int Calculator::priority(char a)
  47. {
  48. if ((a == '+') || (a == '-'))
  49. return 1;

  50. else if ((a == '*') || (a == '/'))
  51. return 2;
  52. else
  53. return 0;
  54. }
  55. //根据符号进行运算
  56. int Calculator::express(int left, int right, char op)
  57. {
  58. int ret = 0;

  59. switch (op)
  60. {
  61. case '+':
  62. ret = left + right;
  63. break;
  64. case '-':
  65. ret = left - right;
  66. break;
  67. case '*':
  68. ret = left * right;
  69. break;
  70. case '/':
  71. ret = left / right;
  72. break;
  73. default:
  74. break;
  75. }

  76. return ret;
  77. }
  78. //将char转为int
  79. int value(char c)
  80. {
  81. return (c - '0');
  82. }
  83. //总体计算函数
  84. int Calculator::ret(char* a)
  85. {
  86. int i = 0;
  87. int j = 0;
  88. stack<char> n;
  89. stack<int> h;
  90. if (a == NULL)
  91. {
  92. cout << "Something wrong!..." << endl;
  93. return 0;
  94. }
  95. while (a[i] != '\0')
  96. {
  97. if (isnum(a[i]))
  98. {
  99. m[j++] = a[i];
  100. }
  101. else if (isOperator(a[i]))
  102. {
  103. while ((n.size() != 0) && (priority(a[i]) <= priority(n.top())))
  104. {
  105. m[j++] = n.top();
  106. n.pop();
  107. }
  108. n.push(a[i]);
  109. }
  110. else if (isleft(a[i]))
  111. {
  112. n.push(a[i]);
  113. }
  114. else if (isright(a[i]))
  115. {
  116. while ((n.size() != 0) && (!isleft(n.top())))
  117. {
  118. m[j++] = n.top();
  119. n.pop();
  120. }
  121. n.pop();
  122. }
  123. else
  124. {
  125. cout << "Invalid expression!1" << endl;
  126. break;
  127. }
  128. i++;
  129. }
  130. while ((n.size() > 0) && (a[i] == '\0'))
  131. {
  132. m[j++] = n.top();
  133. n.pop();
  134. }
  135. m[j] = '\0';
  136. ///前半部分进行中缀转后缀,下面是后缀算数。

  137. i = 0;
  138. j = 0;
  139. int right = 0;
  140. int left = 0;
  141. int result = 0;
  142. int ret;
  143. while (m[i] != '\0')
  144. {
  145. if (isnum(m[i]))
  146. {
  147. j = value(m[i]);
  148. h.push(j);
  149. }
  150. else if (isOperator(m[i]))
  151. {
  152. right = h.top();
  153. h.pop();
  154. left = h.top();
  155. h.pop();
  156. result = express(left, right, m[i]);
  157. h.push(result);
  158. }
  159. else
  160. {
  161. cout << "Invalid expression!2" << endl;
  162. break;
  163. }
  164. i++;
  165. }
  166. if ((h.size() == 1) && (m[i] == '\0'))
  167. {
  168. ret = h.top();
  169. h.pop();
  170. }
  171. else
  172. {
  173. cout << "Invalid expression!2" << endl;
  174. ret = 0;
  175. }
  176. delete m;
  177. return ret;
  178. }

在C语言中,使用栈(Stack)实现计算器的主要目的是演示递归调用和表达式求值的基本算法,特别是后缀表达式(也称为逆波兰表示法,RPN)。这种方法不需要复杂的符号表或优先级规则,非常适合教学和理解递归。 以下是一个简单的实现后缀表达式计算器的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义数据结构 typedef struct { double num; } Number; typedef struct { char operator; Number left, right; } Expression; // 函数声明 void push(Number stack[], int &top); double pop(Number stack[], int &top); char pop_operator(Number stack[], int &top); // 后缀表达式处理函数 double evaluate_postfix(char* exp); int main() { char expression[100]; printf("Enter an expression in postfix notation: "); fgets(expression, sizeof(expression), stdin); expression[strcspn(expression, "\n")] = '\0'; // 去除末尾的换行符 double result = evaluate_postfix(expression); printf("Result: %.2lf\n", result); return 0; } // 操作 void push(Number stack[], int &top) { Number n = {atof(stack[top].num)}; top++; stack[top] = n; } double pop(Number stack[], int &top) { top--; return stack[top].num; } char pop_operator(Number stack[], int &top) { top--; return stack[top].operator; } // 表达式求值 double evaluate_postfix(char* exp) { int top = 0; Number stack[100]; // 大小可调整 stack = {'0'}; // 初始化顶为0 for (int i = 0; exp[i] != '\0'; i++) { if (isdigit(exp[i])) { push(stack, top); // 如果是数字,压入 } else { double right = pop(stack, top); double left = pop(stack, top); switch (exp[i]) { case '+': stack[top++] = {left + right}; break; case '- right}; break; case '*': stack[top++] = {left * right}; break; case '/': stack[top++] = {left / right}; break; // 添加其他运算符处理 } } } return pop(stack, top); // 返回结果 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值