假定算数表达式的值均为非负整数常数,不包含变量、小 数和字符常量。 试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、(和); 2、 编写 main 函数进行测试。给出详细注释
时间: 2023-11-08 10:58:25 浏览: 59
非常感谢您对ChitGPT的信任与支持!关于您的问题,我会尽力提供最好的答案。以下是算术四则运算表达式求值的简单计算器的设计方案:
1. 将算术表达式存储在一个字符串中;
2. 遍历该字符串中的每一个字符,分情况考虑:
a. 如果当前字符是数字,那么将其添加到一个临时变量中,继续遍历下一字符;
b. 如果当前字符是操作符,那么先将上一个数字压入数字栈中,再将当前操作符压入符号栈中;
c. 如果当前字符是左括号,那么将其压入符号栈中;
d. 如果当前字符是右括号,那么将数字栈中的数字和符号栈中的符号依次弹出进行计算,直到遇到左括号为止;
3. 遍历结束后,如果符号栈中还有操作符,依次弹出进行计算,直到符号栈为空;
4. 最终得到的数字即为算术表达式的值。
下面是该计算器的详细实现代码,其中包括 main 函数的调用:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_LEN 100 // 最大的算术表达式长度
int numStack[MAX_LEN], topNum = -1; // 数字栈
char opStack[MAX_LEN], topOp = -1; // 符号栈
// 压入数字栈
void pushNum(int num) {
numStack[++topNum] = num;
}
// 弹出数字栈
int popNum() {
return numStack[topNum--];
}
// 压入符号栈
void pushOp(char op) {
opStack[++topOp] = op;
}
// 弹出符号栈
char popOp() {
return opStack[topOp--];
}
// 返回当前符号栈顶的符号
char peekOp() {
return opStack[topOp];
}
// 计算表达式
void calculate() {
int b = popNum();
int a = popNum();
char op = popOp();
int res;
switch (op) {
case '+':
res = a + b;
break;
case '-':
res = a - b;
break;
case '*':
res = a * b;
break;
case '/':
res = a / b;
break;
default:
printf("错误的操作符!\n");
exit(-1);
}
pushNum(res);
}
// 判断字符是否是操作符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 获取操作符的优先级
int getPriority(char op) {
switch(op) {
case '(':
return 0;
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
printf("错误的操作符!\n");
exit(-1);
}
}
// 计算算术表达式
int calculateExpression(char* exp) {
for (int i = 0; exp[i] != '\0'; i++) {
if (isdigit(exp[i])) { // 当前字符是数字
int num = 0;
while (isdigit(exp[i])) {
num = num * 10 + exp[i] - '0';
i++;
}
i--;
pushNum(num);
} else if (isOperator(exp[i])) { // 当前字符是操作符
while (topOp != -1 && getPriority(exp[i]) <= getPriority(peekOp())) {
calculate();
}
pushOp(exp[i]);
} else if (exp[i] == '(') { // 当前字符是左括号
pushOp(exp[i]);
} else if (exp[i] == ')') { // 当前字符是右括号
while (peekOp() != '(') {
calculate();
}
popOp(); // 弹出左括号
}
}
// 处理剩余的操作符
while (topOp != -1) {
calculate();
}
return popNum();
}
int main() {
char exp[MAX_LEN];
printf("请输入算术表达式(非负整数常数,操作符仅为+、-、*、/、(和)):");
scanf("%s", exp);
printf("计算结果:%d\n", calculateExpression(exp));
return 0;
}
```
希望这个设计方案和代码能帮到您,如有不懂请随时问我。
阅读全文