求助简单计算器
  • 板块题目总版
  • 楼主NightTide
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/5/2 11:59
  • 上次更新2023/10/28 02:25:21
查看原帖
求助简单计算器
547908
NightTide楼主2022/5/2 11:59

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();
}

2022/5/2 11:59
加载中...