給定一個只包含加法和乘法的算術表達式,請你編程計算表達式的值的最後四位。
輸入格式
輸入僅有一行,爲需要你計算的表達式,表達式中只包含數字、加法運算符’+‘和乘法運算符’*’,且沒有括號,所有參與運算的數字均爲 到 之間的整數。
輸入數據保證這一行只有 0~9、’+’、’*'這 種字符。
(輸入字符串長度不超過 )
輸出格式
輸出只有一行,包含一個整數,表示這個表達式的值。
注意:當答案長度多於 位時,請只輸出最後 位。
不要輸出多餘的前導零。
樣例輸入
1+1*3+4
樣例輸出
8
樣例輸入
1+1234567890*1
樣例輸出
7891
表達式求值方法:
1.設兩個棧,符號棧與數字棧;
2.掃描表達式,遇到數字則進棧,遇到符號則轉第3步,掃描完成轉第4步;
3.遇到符號,首先將符號棧中優先級比當前符號大的都彈出,每次取出數字棧頂兩個元素,求值後壓入數字棧,將當前符號壓入符號棧。轉第2步;
4.掃描完成棧頂就是所求的值。mod取後四位
#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack> //c++自帶棧在STL模板庫裏調用
using namespace std;
string x;
stack <char> s; //算符棧
stack <long long> n; //數字棧
long long ans;
int len;
int main()
{
int i=0;
getline(cin,x);
len=x.length();
while (i<=len-1)
{
int t=0;
bool f=false;
while (x[i]>='0'&&x[i]<='9') //對數字的操作
{
t=t*10+(x[i]-48);
f=true;
i++;
}
if (f)
{
n.push(t%10000);
if (s.size()>=1 && s.top()=='*') //處理乘號
{
int k=n.top();
s.pop();
n.pop(); //先把top的數出棧,再讓top-1的數成爲top,兩個相乘,再讓top出棧,讓乘積進棧
k*=n.top(); //n[--top]=n[top]*n[top+1];
n.pop();
n.push(k%10000);
}
}
if (x[i]=='+' || x[i]=='*')
{
s.push(x[i]);
i++;
}
}
int size=n.size();
for (i=1;i<=size;i++) //計算和
{
ans+=n.top();
n.pop();
ans%=10000;
}
printf("%lld",ans%10000);
return 0;
}