C语言实现简单计算器:算术表达式求值
这段代码实现了一个简单的计算器程序,用于计算输入的算术表达式的结果。
#include <stdio.h>
#include <string.h>
// 设置符号优先级
int compareReturn(char str1) {
if (str1 == '#') {
return 0;
} else if (str1 == '+' || str1 == '-') {
return 1;
} else if (str1 == '*' || str1 == '/') {
return 2;
} else {
printf('输入了无效符号');
return -1;
}
}
// 计算函数
int jisuan(int x, char str1, int y) {
int ans = 0;
if (str1 == '+') {
ans = x + y;
} else if (str1 == '-') {
ans = x - y;
} else if (str1 == '*') {
ans = x * y;
} else if (str1 == '/') {
ans = x / y;
} else {
;
}
return ans;
}
int main(int argc, const char * argv[]) {
// 初始化两个栈
// 第一个栈为数字栈
// 第二个栈为符号栈
int firstStack [100] = {0};
int firstTop = -1;
char secondStack [100] = {'#'};
// printf('%c', secondStack[0]);
int secondTop = 0;
char str[100];
int flag = -1;
// printf('请输入待计算的算术表达式:\n');
scanf('%s', str);
// 表达式长度
int x = 0;
int length = (int)strlen(str);
for (int i = 0; i < length;) {
if (str[i] >= '0' && str[i] <= '9') {
x *= 10;
x += str[i++] - '0';
flag=1;
} else {
if(flag==1)
{
firstStack[++firstTop] = x;
x = 0;
flag=-1;
}
if (compareReturn(secondStack[secondTop]) < compareReturn(str[i])) {
secondStack[++secondTop] = str[i++];
} else {
int b = firstStack[firstTop--];
int a = firstStack[firstTop--];
// printf('%d %c %d\n',a,secondStack[secondTop],b);
// printf('%d\n', firstTop);
firstStack[++firstTop] = jisuan(a, secondStack[secondTop], b);
secondTop--;
if (str[i] == '#' && secondTop == 0) {
break;
}
}
}
}
// printf('%d\n', firstTop);
// printf('%d\n', secondTop);
printf('%d', firstStack[firstTop]);
}
执行步骤:
- 首先,程序会初始化两个栈,第一个栈为数字栈,第二个栈为符号栈。数字栈用于存储算术表达式中的数字,符号栈用于存储算术表达式中的符号。初始化数字栈的栈顶指针为-1,符号栈的栈顶指针为0。同时,将符号栈的第一个元素设置为'#'。
- 然后,程序会获取用户输入的算术表达式,并存储在字符数组str中。
- 接下来,程序会遍历表达式中的每个字符,进行如下操作:
- 如果当前字符是数字,则将其转换为整数,并将其累加到x中。同时,将flag设置为1,表示当前正在处理数字。
- 如果当前字符是符号,则需要将之前累加的数字x入栈,并将x重置为0。然后,将当前符号入栈。
- 如果当前符号的优先级比栈顶符号的优先级高,则直接将当前符号入栈。
- 如果当前符号的优先级不高于栈顶符号的优先级,则需要从数字栈中取出两个数字,并从符号栈中取出一个符号进行计算。然后,将计算结果入栈。同时,将栈顶指针相应地调整。
- 如果当前字符是结束符号'#',且符号栈只剩下一个元素(即第一个元素'#'),则计算结束。
- 最后,程序输出数字栈中剩下的唯一一个元素,即为计算结果。
注意事项:
- 输入的算术表达式只能包含数字、加号、减号、乘号和除号。
- 输入的算术表达式不能有空格。
- 输入的算术表达式的数字不能超过int类型的范围。
原文地址: https://www.cveoy.top/t/topic/pdff 著作权归作者所有。请勿转载和采集!