波兰表达式(用栈)
#include<iostream>
#include<cstdio>
#include<cstring>
//后缀表达式
using namespace std;
int main(){
long long int num[20];
char s[20];
int pos;
while(cin>>s){
int result=0;
if(isdigit(s[0])){
result=s[0]-'0';
int len=strlen(s);
if(len>1)
for(int i=1;i<len;i++){
result=result*10+s[i]-'0';
}
//result=atof(s);
num[pos++]=result;
}
if(s[0]=='+') {num[pos-2]=num[pos-1]+num[pos-2];pos--;}
if(s[0]=='-') {if(s[1]=='\0'){num[pos-2]=num[pos-1]-num[pos-2];pos--;}int temp=0;int leng=strlen(s);for(int i=1;i<leng;i++)temp=temp*10+s[i];num[pos++]=-temp;}
if(s[0]=='*') {num[pos-2]=num[pos-1]*num[pos-2];pos--;}
if(s[0]=='/') {num[pos-2]=num[pos-1]/num[pos-2];pos--;}
}
printf("%I64d\n",num[0]);
return 0;
}
逆波兰表达式(递归)
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
double exp(){
char s[10];//浮点数的输入
cin>>s;
switch(s[0]){
case '+': return exp()+exp();
case '-': if(s[1]=='\0')return exp()-exp();else return atof(s);
case '*': return exp()*exp();
case '/': return exp()/exp();
default: return atof(s);//将字符串 转换为 双精度浮点数
break;
}
}
int main(){
printf("%lf\n",exp());
return 0;
}
中缀表达式(递归)
#include<iostream>
#include<cstdio>
using namespace std;
char s[1000];
int pos=0;
int expression();
int term();
int factor();
int main(){
cin>>s;
printf("%d",expression());
return 0;
}
int expression(){
int result=term();
if(s[pos]=='+'){
pos++;
result+=term();
}
if(s[pos]=='-'){
pos++;
result-=term();
}
return result;
}
int term(){
int result=factor();
if(s[pos]=='*'){
pos++;
result*=factor();
}
if(s[pos]=='/'){
pos++;
result/=factor();
}
return result;
}
int factor(){
int result=0;
if(s[pos]=='('){
pos++;
result+=expression();
pos++;
}
while(isdigit(s[pos])){
result=result*10+s[pos]-'0';
pos++;
}
return result;
}