ZBLOG

#include #include #include #define MAX_SIZE 100 // 定义栈结构 typedef struct { int data[MAX_SIZE]; int top; } Stack; void initStack(Stack *s) { s->top = -1; } int isEmpty(Stack *s) { return s->top == -...

要支持多位小数的情况,可以对代码进行适当修改。以下是修改后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #define MAX_SIZE 100
  5. // 定义栈结构
  6. typedef struct {
  7. double data[MAX_SIZE];
  8. int top;
  9. } Stack;
  10. void initStack(Stack *s) {
  11. s->top = -1;
  12. }
  13. int isEmpty(Stack *s) {
  14. return s->top == -1;
  15. }
  16. void push(Stack *s, double value) {
  17. if (s->top >= MAX_SIZE - 1) {
  18. printf("栈已满,无法入栈!\n");
  19. exit(1);
  20. }
  21. s->data[++(s->top)] = value;
  22. }
  23. double pop(Stack *s) {
  24. if (isEmpty(s)) {
  25. printf("栈已空,无法出栈!\n");
  26. exit(1);
  27. }
  28. return s->data[(s->top)--];
  29. }
  30. double peek(Stack *s) {
  31. if (isEmpty(s)) {
  32. printf("栈已空,无法取栈顶元素!\n");
  33. exit(1);
  34. }
  35. return s->data[s->top];
  36. }
  37. double calculate(double a, char operator, double b) {
  38. switch(operator) {
  39. case '+':
  40. return a + b;
  41. case '-':
  42. return a - b;
  43. case '*':
  44. return a * b;
  45. case '/':
  46. if (b == 0.0) { // 处理除数为零的情况
  47. printf("除数不能为零!\n");
  48. exit(1);
  49. }
  50. return a / b;
  51. default:
  52. printf("非法运算符!\n");
  53. exit(1);
  54. }
  55. }
  56. double evaluate(char *expression) {
  57. Stack operandStack; // 操作数栈
  58. Stack operatorStack; // 运算符栈
  59. initStack(&operandStack);
  60. initStack(&operatorStack);
  61. int i = 0;
  62. while (expression[i] != '\0') {
  63. if (isdigit(expression[i])) { // 处理数字字符
  64. double num = 0.0;
  65. while (isdigit(expression[i]) || expression[i] == '.') {
  66. if (expression[i] == '.') {
  67. i++;
  68. break;
  69. }
  70. num = num * 10 + (expression[i] - '0');
  71. i++;
  72. }
  73. double decimal = 0.1;
  74. while (isdigit(expression[i])) {
  75. num += decimal * (expression[i] - '0');
  76. decimal /= 10.0;
  77. i++;
  78. }
  79. push(&operandStack, num);
  80. } else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { // 处理运算符
  81. while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(' && ((expression[i] == '*' || expression[i] == '/') ||
  82. ((expression[i] == '+' || expression[i] == '-') && (peek(&operatorStack) == '+' || peek(&operatorStack) == '-')))) {
  83. char op = pop(&operatorStack);
  84. double b = pop(&operandStack);
  85. double a = pop(&operandStack);
  86. double result = calculate(a, op, b);
  87. push(&operandStack, result);
  88. }
  89. push(&operatorStack, expression[i]);
  90. i++;
  91. } else if (expression[i] == '(') { // 处理左括号
  92. push(&operatorStack, expression[i]);
  93. i++;
  94. } else if (expression[i] == ')') { // 处理右括号
  95. while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(') {
  96. char op = pop(&operatorStack);
  97. double b = pop(&operandStack);
  98. double a = pop(&operandStack);
  99. double result = calculate(a, op, b);
  100. push(&operandStack, result);
  101. }
  102. if (!isEmpty(&operatorStack) && peek(&operatorStack) == '(') {
  103. pop(&operatorStack); // 弹出左括号
  104. } else {
  105. printf("括号不匹配!\n");
  106. exit(1);
  107. }
  108. i++;
  109. } else if (expression[i] == ' ') { // 处理空格
  110. i++;
  111. } else { // 非法字符处理
  112. printf("非法字符!\n");
  113. exit(1);
  114. }
  115. }
  116. while (!isEmpty(&operatorStack)) {
  117. char op = pop(&operatorStack);
  118. double b = pop(&operandStack);
  119. double a = pop(&operandStack);
  120. double result = calculate(a, op, b);
  121. push(&operandStack, result);
  122. }
  123. return peek(&operandStack); // 返回最终结果
  124. }
  125. int main() {
  126. char expression[MAX_SIZE];
  127. printf("请输入中缀表达式:");
  128. fgets(expression, sizeof(expression), stdin);
  129. // 将输入的字符串去掉末尾的换行符
  130. if (expression[strlen(expression)-1] == '\n') {
  131. expression[strlen(expression)-1] = '\0';
  132. }
  133. double result = evaluate(expression);
  134. printf("计算结果:%lf\n", result);
  135. return 0;
  136. }

修改后的代码在处理数字字符时支持多位小数,通过识别小数点进行处理。其他部分保持不变。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9239

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?