今天数据结构课老师让写的,好歹花了40分钟写的,删了可惜就贴一下吧,支持加,减,乘,除,括号,取模,幂运算,不过因为幂运算一般都比较大,所以改用快速幂了,去10^9+7的模,代码:
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
char op[200];
long long num1[200],opsize,numsize;
map<char,int> pri;
bool isnum(char a)
{
if(a>='0'&&a<='9') return true;
return false;
}
long long qm(long long a,long long b)
{
long long x=1;
while(b){
if(b&1) x=(x*a)%1000000007;
a=(a*a)%1000000007;
b>>=1;
}
return x;
}
void solve(char t)
{
if(opsize==0){
op[opsize++]=t;
return ;
}
while(opsize&&pri[t]<pri[op[opsize-1]]){
if(op[opsize-1]=='(') break;
opsize--;
long long a,b;
b=num1[--numsize];a=num1[--numsize];
if(op[opsize]=='+')
num1[numsize++]=a+b;
if(op[opsize]=='-')
num1[numsize++]=a-b;
if(op[opsize]=='*')
num1[numsize++]=a*b;
if(op[opsize]=='/')
num1[numsize++]=a/b;
if(op[opsize]=='^')
num1[numsize++]=qm(a,b);
if(op[opsize]=='%')
num1[numsize++]=a%b;
}
if(t==')') opsize--;
else op[opsize++]=t;
}
int main()
{
pri['#']=-2;pri['^']=3;
pri[')']=-1;pri['(']=10;
pri['+']=pri['-']=1;
pri['%']=pri['*']=pri['/']=2;
char exp[200];
while(cin>>exp){
long long len=strlen(exp),t=0;
bool mark=false;
opsize=0;numsize=0;
exp[len]='#';
for(int i=0;i<=len;i++){
if(isnum(exp[i])){
t=t*10+exp[i]-'0';
mark=true;
}
else{
if(mark) num1[numsize++]=t;
t=0;mark=false;
solve(exp[i]);
}
}
cout<<num1[0]<<endl;
}
return 0;
}