讨论/题目交流/求教大侠指出错在哪里?/
求教大侠指出错在哪里?

表达式求值

我的思路:先转换成后缀表达式,再按后缀表达式的方法计算。

C++11
开O2
提交的代码:

//导入一大堆头文件
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<string>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<unistd.h>
#include<stack>
#include<queue>
#include<exception>
#include<vector>
using namespace std;
int main()
{
    string in,x;//in是输入的字符串,x是用来做运算的字符串。
    stack<int>num;//数字栈,用来配合字符串x做运算。
    stack<char>op;//符号栈,只是中间部分,最终都要倒入做运算的字符串x内。
    cin>>in;
    for(int i=0;in[i]!='\0';i++){
        if('0'<=in[i]&&in[i]<='9'){//是数字。
            x+=in[i];//直接贴到字符串。
            if(!('0'<=in[i+1]&&in[i+1]<='9')){//假如后面没有了数。
//那么就加上'.',因为我用'.'分割数字,后面才能根据'.'往数字栈里面填入十位数、百位数,否则的话,不知道到底是两个数还是一个数,就会错。(后面代码自然会说明)
                x+='.';
            }
        }else{
            if(in[i]=='+'||in[i]=='-'){//
                if(!op.empty()){//如果栈没空,才能进行后面计算。
                    if(op.top()==''||op.top()=='/'){//由于优先级的关系,乘号必须压在加减号上面,加减号不能压在乘号除号上面。
                        while(!op.empty()){//全部计算,清空站。
                            x+=op.top();//直接倒入x里面。
                            op.pop();//没用了,扔垃圾桶里去。
                            x+='.';//我还是用'.'来隔开。
                        }
                        //做完这一切后,会到后面的push。
                    }
                }
                op.push(in[i]);//push这个符号。
            }else{
                op.push(in[i]);//乘除号优先级最高,不用和加减号那样判断优先级。
            }
        }
    }
    while(!op.empty()){//把栈清空。
        x+=op.top();
        op.pop();
        x+='.';
    }
//    cout<<x<<endl;
    for(int i=0;x[i]!='\0';i++){//遍历这个字符串。
        if('0'<=x[i]&&x[i]<='9'){//检查到数字。
            int kl=x[i++]-'0';//因为是字符,所以要减去'0',才能变成真正的数字。
            while(x[i]!='.'){//一直到发现分隔符。
                kl
=10;//把原来的数乘以10,因为这时候这个数的位数加1,后面要填入个位数。
                kl+=x[i]-'0';//添加个位数。
                i++;//移动索引到下一个位置。
            }
            i--;//后面是i++,这里要--。
            num.push(kl);//不要忘了把这个数添加到数字栈。
        }
        if(x[i]=='+'||x[i]=='-'||x[i]==''||x[i]=='/'){//是运算符号。
            int kl,a,b;//a是运算符前面的那个数,b是后面的,kl是结果。
            if(num.size()<2){
                cout<<"error"<<endl;
                return 0;
            }
            b=num.top();//由于是栈,要颠倒过来,栈顶的元素是后面的,后进先出。
            num.pop();
            a=num.top();
            num.pop();
            switch(x[i])//看看这个运算符,好做相应的运算。
            {
                //加减乘都没问题。
                case '+':kl=a+b;break;
                case '-':kl=a-b;break;
                case '
':kl=a*b;break;
                //除法,要做判断。
                case '/'://这是除法。
                    if(b==0){//如果除数是0。
                        cout<<"error!"<<endl;//那么就是错误的,除数不能为0。
                        return 0;//后面的运算就不用管。
                    }
                    kl=a/b;//判断结束,可以正常运算。
                    break;
            }
            num.push(kl);//把结果入栈。
        }
    }
    if(num.size()>=2||num.empty()){//数字和运算符不匹配,也是错误。
        cout<<"error!"<<endl;//输出错误。
        return 0;//直接return。
    }
    num.push(num.top()%10000);//题目要求只输出后四位数。
    cout<<num.top()<<endl;//输出结果。
    return 0;
}

这段代码我自己给一个数据都可以过,但是却只能过个测试点,为什么?

展开讨论
共 1 个讨论

把代码放到代码框里,不然看起来不方便
然后你又没说数据范围,既然只能过一个测试点,那多半是超范围了
比如说:

  • 有没有负数
  • 有没有小数
  • 有没有括号
  • 有没有数字超int
  • 有没有运算过程中间超int
    这样?
1