計蒜客-14 表達式求值

給定一個只包含加法和乘法的算術表達式,請你編程計算表達式的值的最後四位。

輸入格式

輸入僅有一行,爲需要你計算的表達式,表達式中只包含數字、加法運算符’+‘和乘法運算符’*’,且沒有括號,所有參與運算的數字均爲 0023112^{31}-1 之間的整數。

輸入數據保證這一行只有 0~9、’+’、’*'這 1212 種字符。

(輸入字符串長度不超過 600000?600000?

輸出格式

輸出只有一行,包含一個整數,表示這個表達式的值。

注意:當答案長度多於 44 位時,請只輸出最後 44 位。

不要輸出多餘的前導零。

樣例輸入

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;
}


在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章