用了python_zhang的代码,可谓最简洁的了,厉害了🐂
针对 100*-2这种按理说不该出现的情况使用f_new变量进行了修正
#include <stdio.h>
#include <string.h>
// 1.无括号 用栈先乘除后加减
// 遇到+-继续入栈,遇到*/出栈1个,和新元素计算后入栈
// 2.有括号 左括号开始递归1步骤,右括号出递归结果 入栈
//注意遇到括号内有负号先要变号再入栈
int i;
int compute(char *data);
int main()
{
char str[1000];
scanf("%s", str);
i=0;
int res = compute(str);
printf("%d", res);
return 0;
}
int compute(char *data)
{
int stack[1000]; //栈中只装加法运算的操作数,一个元素代表+、- xxx +、-中的xxx
int top = -1;
int len = strlen(data);
char flag = '+';
while (i <=len)
{
int num = 0;
int f_new = 0;
// 用来将最开始或者括号后的减变为负号
if((flag=='*' || flag=="/")&&data[i]=='-'){
i++;
f_new=1;
}
else if(data[i]=='-'){
flag = '-';
i++;
}
// 左括号开始递归
if (data[i] == '{' || data[i] == '[' || data[i] == '(')
{
i++;
num = compute(data);
}
// 读取数据--从最高位读取的计算该值的实际大小的方法
while (data[i] - '0' >= 0 && data[i] - '0'<=9)
{
num = num * 10 + data[i] - '0';
i++;
}
if(f_new==1){
num = -num;
f_new = 0;
}
switch(flag)
{
case '+':
stack[++top] = num; // 入栈 top对应最新的数据
break;
case '-':
stack[++top] = -num;
break;
case '*':
stack[top] *= num; // 和栈顶的元素作算法
break;
case '/':
stack[top] /= num;
break;
}
// num 后的运算符
flag = data[i];
if (data[i] == '}' || data[i] == ']' || data[i] == ')')
{
i++;
break;
}
i++;
}
int ret = 0;
for (int j = 0; j <= top; j++)
{
ret += stack[j];
}
return ret;
}



京公网安备 11010502036488号