表达式求值

  今天数据结构课老师让写的,好歹花了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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值