結題報告


#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.     結束時不要想當然地結束循環,而應思考一下還有什么操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM