RT,要求一个简单计算器,自己写了一份代码,但是好像是 RE 了,把简单计算器那部分发上来,求大佬帮忙调一下
/*
main 函数里定义了优先级如下
piror['*'] = piror['/'] = 2;
piror['+'] = piror['-'] = 1;
piror['('] = 0;
piror[')'] = 3;
expre 是表达式
map<string,string> data;
data[A] 表示变量 A 对于的表达式,举个例子:
a = b + c
则 data["a"] = "b+c"
"" 里的表示 string 类型字符串
map<string,bool> isdefined;
isdefined[A] 表示遍历 A 是否被定义过
如果对程序有疑问还请在评论中指出
*/
int calculator(string expre){
if(!flag) return 0;
stack<int> num;
stack<char> symbol;
for(int i = 0;i < expre.length();i++){
if(isdigit(expre[i])){
int x = 0;
while(i < expre.length() && isdigit(expre[i])){
x = x*10 + expre[i] - '0';
i++;
}
i--;
num.push(x);
}else if(isletter(expre[i])){
string tmp;
while(i < expre.length() && ( isdigit(expre[i]) || isletter(expre[i]) ) ){
tmp += expre[i];
i++;
}
i--;
if(!isdefined[tmp]){
flag = false;
return 0;
}
num.push(calculator(data[tmp]));
}else if(issymbol(expre[i])){
if(symbol.empty()) symbol.push(expre[i]);
else if(expre[i] == '(') symbol.push(expre[i]);
else if(expre[i] == ')'){
while(!symbol.empty() && symbol.top() != '('){
char c = symbol.top(); symbol.pop();
int b = num.top(); num.pop();
int a = num.top(); num.pop();
if(c == '+') num.push(a + b);
else if(c == '-') num.push(a - b);
else if(c == '*') num.push(a * b);
}
if(!symbol.empty()) symbol.pop();
}else{
while(!symbol.empty() && piror[symbol.top()] >= piror[expre[i]]){
char c = symbol.top(); symbol.pop();
int b = num.top(); num.pop();
int a = num.top(); num.pop();
if(c == '+') num.push(a + b);
else if(c == '-') num.push(a - b);
else if(c == '*') num.push(a * b);
}
symbol.push(expre[i]);
}
}
}
while(!symbol.empty()){
char c = symbol.top(); symbol.pop();
int b = num.top(); num.pop();
int a = num.top(); num.pop();
if(c == '+') num.push(a + b);
else if(c == '-') num.push(a - b);
else if(c == '*') num.push(a * b);
}
return num.top();
}