算术表达式求值:含乘方,单目减,运算量为变量或实数。
#include<bits/stdc++.h>
using namespace std;
string in;
stack<char> op;
stack<double> num;
int cmp(char a,char b){
map<char,int> prior;
prior['\n']=0;
prior['+']=prior['-']=1;
prior['*']=prior['/']=2;
prior['^']=3;
if(a=='('&&b==')') return 0;
if(a=='('||b=='(') return -1;
if(a==')'||b==')'||prior[a]==prior[b]) return 1;
return (prior[a]-prior[b])>0?1:-1;
}
int main(){
while(1){
const int x=2;
double tn;
char tc,tp='\n';
op.push('\n');
tc=cin.get();
while(tc!='\n'||op.top()!='\n'){
if(isalnum(tc)){
if(tc=='x') tn=x;
else{
cin.putback(tc);
cin>>tn;
}
num.push(tn);
tp=tc;
tc=cin.get();
}
else{
if(tc=='-'&&!isalnum(tp)) num.push(0);
switch(cmp(op.top(),tc)){
case -1:
op.push(tc);tp=tc;tc=cin.get();break;
case 0:
op.pop();tp=tc;tc=cin.get();break;
case 1:
char c=op.top();op.pop();
double b=num.top();num.pop();
double a=num.top();num.pop();
switch(c){
case '+': num.push(a+b);break;
case '-': num.push(a-b);break;
case '*': num.push(a*b);break;
case '/': num.push(a/b);break;
case '^': num.push(pow(a,b));break;
}
break;
}
}
}
cout<<num.top()<<endl;
}
return 0;
}