后缀表达式计算

题目描述
来自USA的Mr.Allison是某班的英语老师,学期开始之前他要求自己班的同学阅读一本英文小说,并写一份50000字的读书报告。该班的同学很苦恼,并想方设法让Mr.Allison放弃读书笔记这个念头,于是该班的大牛PYY想到一个借口:看那么多份读书笔记会花费很多时间的!把这个理由告诉Mr.Allison之后,Mr.Allison也觉得挺有道理,但一共要阅读多少文字呢?于是PYY就给出一条后缀表达式,并告诉Mr.Allison说,这条表达式的结果就是您要阅读的文字。Mr.Allison的数学不咋地,于是就找你来帮他计算这条后缀表达式的值。

输入描述
一个长度不超过100的字符串,代表一条后缀表达式。表达式中只含有+、-、、/ 四种运算符和26个小写英文字母,不含其它字符。每一个英文字母代表一个正整数:
a = 1,b = 2,c = 3…y = 25,z = 26。

输出描述
每一个输入样例,单独一行输出结果:后缀表达式的值,一个正实数 S,保留两位小数。

样例输入

ab+c*
int**py++

样例输出

9.00
2561.00

我的答案

#include <iostream>
#include <iomanip>
#include <vector>
#include <stack>
using namespace std;

int main(){
        stack<double> st;
        vector<char> str;
        string tempstr;
        cin>>tempstr;
        str.assign(tempstr.begin(),tempstr.end());
        
        for (int j = 0; j < str.size(); j++){//遍历vector中每个元素
          if(str[j]>='a'&&str[j]<='z'){
              double a1=str[j]-'a'+1;
              st.push(a1);
              }
          else if (str[j]=='*'){
              double a=st.top();
              st.pop();
              double b=st.top();
              st.pop();
              st.push(a*b);
         }
         else if (str[j]=='/'){
              double a=st.top();
              st.pop();
              double b=st.top();
              st.pop();
              st.push(b/a);
         }
         else if (str[j]=='+'){
             double a=st.top();
             st.pop();
             double b=st.top();
             st.pop();
             st.push(a+b);
         }
         else if (str[j]=='-'){
             double a=st.top();
             st.pop();
             double b=st.top();
             st.pop();
             st.push(b-a);
         }
        }
        cout<<fixed<<setprecision(2)<<st.top()<<endl;
}

ZHC的答案


#include<iostream>
#include<iomanip>
using namespace std ;
//cout<<fixed<<setprecision(2)<<a;
/*用栈实现后缀表达式的计算:
遇到操作数:入栈
遇到操作符:将栈顶的两个元素弹出,进行运算,将结果入栈
最后栈里有且只有一个元素(异常处理)
*/
class Stack{
private:
    double*data; //储存数值
    int  num;
    int Capacity ;
public:
    Stack(){
     Capacity = 100 ;
    num = 0 ;
    this->data = new double[Capacity];
    }
    ~Stack(){
    delete [] this->data ;
    }
    
    bool isop(char t){ //判断是否为操作符
        if( t=='+' || t=='-' || t=='*' || t=='/') return true;
        else return false;
    }
    bool isnum(char t){ //判断是否为数字
        double k =t ;
        if( k>=97 && k<=122 ){
            //data[num]=k-96;++num;
            return true ;
        }
        else return false ;
    }
    double set(double a ,double b,char t){//进行相应得运算
    if(t=='+') return a+b ;
    if(t=='-') return a-b ;
    if(t=='*') return a*b ;
    if(t=='/') return a/b ;
    }
    
    void pop(char t){
        if( isnum(t) ){ //是字母就将对应得数字入栈
        double k = t ;
        data[num]=k-96;
        ++num;
        }
        if( isop(t) ){
        //是操作符就将上面两个数字出栈并运算,并将运算结果入栈
            double h=set(data[num-2],data[num-1],t);
            --num;
            data[num-1]=h;
        }
    }

    void calculate(const string s){
     for(int i = 0 ; i<s.size() ; ++i ){
             this->pop( s.at(i) ) ;     
        }
    }
      double get_result()const{
            if( num == 1 )   return data[0];
    }
};

int main(){
    Stack exp ;
    string s ;
    cin>>s ;
    exp.calculate(s);
    cout<<fixed<<setprecision(2)<<exp.get_result() ;
}
支持 makedown语法