UESTC 1074 秋实大哥搞算数 栈模拟

时间:2023-03-10 05:35:52
UESTC 1074 秋实大哥搞算数 栈模拟

秋实大哥搞算数

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

秋实大哥大学物理挂科了(误),于是在下学期的前两周的某一天要悲剧的补考。为了不给学校的挖掘机大楼做贡献,秋实大哥决定在假期里努力复习。当然,良好的计算能力也是非常必要的,毕竟是涉及计算自己做多少分的题能够通过考试的问题。现在他给自己出了一大堆长长的只有涉及整形四则运算式子,然后埋头计算结果。为了检验自己的计算能力,他请你来帮忙。

Input

第一行一个整数T,表示式子的总数。

接下来每一行有一个长度不超过10^6的表达式,只包含正整数和四则运算符号('+', '-', '*', '/')。

保证输入合法。

Output

对于每一个表达式,输出相应的结果,占一行。

保证运算及结果在long long范围以内。

Sample input and output

Sample Input Sample Output
2
12+5/4-1
4*5/3
12
6

思路:将数和符号分别放入两个栈内;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define esp 1e-10
const int N=1e5+,M=1e6+,mod=1e9+,inf=1e9+;
char a[M];
int main()
{
ll x,y,z,i,t;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",a);
stack<char>s;
stack<ll>num;
x=strlen(a);
ll pos=;
ll n=;
for(pos=;pos<x&&a[pos]>=''&&a[pos]<='';pos++)
{
n*=;
n+=a[pos]-'';
}
num.push(n);
while(pos<x)
{
s.push(a[pos++]);
n=;
while(pos<x&&a[pos]>=''&&a[pos]<='')
{
n*=;
n+=a[pos]-'';
pos++;
}
if(s.top()=='*')
{ ll k=num.top();
num.pop();
num.push(n*k);
s.pop();
}
else if(s.top()=='/')
{
ll k=num.top();
num.pop();
num.push(k/n);
s.pop();
}
else
num.push(n);
}
ll ans=;
while(!s.empty())
{
if(s.top()=='+')
ans+=num.top();
else if(s.top()=='-')
ans-=num.top();
num.pop();
s.pop();
}
printf("%lld\n",ans+num.top());
}
return ;
}