题目描述
来自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() ;
}