zoukankan      html  css  js  c++  java
  • 结题报告

    #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.     结束时不要想当然地结束循环,而应思考一下还有什么操作。

    }

  • 相关阅读:
    google 以图搜图
    一个idear
    负责
    腾讯笔试
    迅雷笔试题
    如何删除表中重复的字段
    sed的使用
    C++ Html解析器HtmlCxx用户手册和源代码解析
    makefile从无到有
    深入理解函数指针
  • 原文地址:https://www.cnblogs.com/eason66-blog/p/eason66-jtbg_blogs.html
Copyright © 2011-2022 走看看