#include <iostream>
#include <stack>
#include <cstio>
#include <cstring>
using namespace std;
stack <float> data;
stack <char> symbol;
int b[5][6];
int change(char a){
    int symbol_index;
    switch(a){
        case '+':symbol_index=1;break;
        case '-':symbol_index=2;break;
        case '*':symbol_index=3;break;
        case '/':symbol_index=4;break;
        case '@':symbol_index=5;break;
    }
    return symbol_index;
}
int main(){
    memset(b,0,sizeof(b));
    b[3][1]=b[3][2]=b[4][1]=b[4][2]=b[1][5]=b[2][5]=b[3][5]=b[4][5]=1;
    string a;
    cin >> a;
    symbol.push('@');
    float index=0;
    for(int i=0;i<a.length();i++){
        if(a[i]=='#'){
            data.push(index);
            break;
        }
        if(a[i]<='9'&&a[i]>='0'){
            index*=10;
            index+=a[i]-'0';
        }
        else{
            data.push(index);
            index=0;
            int symbol_index;
            symbol_index=change(a[i]);
            while(b[symbol_index][change(symbol.top())]==0){
                float b=data.top();
                data.pop();
                float a=data.top();
                data.pop();
                switch(symbol.top()){
                    case '+':data.push(a+b);break;
                    case '-':data.push(a-b);break;
                    case '/':data.push(a/b);break;
                    case '*':data.push(a*b);break;
                }
                symbol.pop();
            }
            symbol.push(a[i]);
        }
    }
    while(symbol.top()!='@'){
        float b=data.top();
        data.pop();
        float a=data.top();
        data.pop();
        switch(symbol.top()){
            case '+':data.push(a+b);break;
            case '-':data.push(a-b);break;
            case '/':data.push(a/b);break;
            case '*':data.push(a*b);break;
        }
        symbol.pop();
    }
    printf("%.4f",data.top());
    return 0;
}

 

思路

       先读入,再循环

             如果是数据,将index变量×10+数据。

             如果是运算符:

先将index压入栈data中,再将index归零。

然后将运算符转换成运算符代码,参见附表1。

然后分两种情况:

1.     symbol栈栈顶运算符优先级没此运算符高:直接压栈。

2.  否则取出symbol栈栈顶和data栈栈顶(b)和新的栈顶(取出后栈顶后新的栈顶,即取出前从上往下排第二的元素)(a)进行运算,然后再分两种情况考虑。

如果是#:index压栈,退出循环。然后把剩下的计算完。参见2。

犯的错误

1.     除法应用float类型,我写成int了。

2.     栈改成int后,其他变量没改。

3.     #时,index没入栈。(思路中已纠正)。

收获

1.     注意类型。

2.     结束时不要想当然地结束循环,而应思考一下还有什么操作。

posted on 2019-12-30 18:28  eason66  阅读(754)  评论(0编辑  收藏  举报