计算

Problem Description

小明在你的帮助下,破译了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”,求出的值就是密码。小明的数学学得不好,还需你帮他的忙。(“/”用整数除法)

Input

输入的第一行为T,表示测试示例的个数,每组数据只有一行是一个算式(算式长度<=30)。

Output

对于每组数据,输出算式的值(所有数据在2^31-1内)。

Sample Input

1
1+(3+2)*(7^2+6*9)/(2)

Sample Output

258
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int p,i,number[40];
char s[40],symbol[40];

int POW(int a,int b) //求a^b 
{
	int j,t=1;
	for(j=1;j<=b;j++) t*=a;
	return t;
}
bool can() //判断前者运算符与当前运算符的优先级 
{
	if((s[i]=='+'||s[i]=='-')&&symbol[p]!='(') return 1;
	if((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'||symbol[p]=='^')) return 1;
	if(s[i]=='^'&&symbol[p]=='^') return 1;
	return 0;
}
void POP()
{
	switch(symbol[p--])
	{
		case'+':number[p]+=number[p+1]; break;
		case'-':number[p]-=number[p+1]; break;
		case'*':number[p]*=number[p+1]; break;
		case'/':number[p]/=number[p+1]; break;
		case'^':number[p]=POW(number[p],number[p+1]); break;
	}
}

#define MAX(a,b) ((a)>(b) ? (a):(b))
#define MIN(a,b) ((a)<(b) ? (a):(b))

int main()
{
	int t;
	
	scanf("%d\n",&t);
	
	while(t--)
	{
		int x,len;
		p=1; i=0;
		
		gets(s);
		len=strlen(s);
		s[len]=')'; symbol[p]='(';
		
		while(i<len)
		{
			while(s[i]=='(')
			{
				symbol[++p]=s[i];
				i++;
			}
			x=0;
			while(s[i]>='0'&&s[i]<='9')
			{
				x=x*10+s[i++]-'0';
			}
			number[p]=x;
			do
			{
				if(s[i]==')')
				{
					while(symbol[p]!='(') POP();
					number[--p]=number[p+1];
				}
				else
				{
					while(can()) POP();
					symbol[++p]=s[i];
				}
				i++;
			}while(i<=len&&s[i-1]==')');
		}
	
		printf("%d\n",number[0]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值