利用栈实现计算简单乘法除法

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号。
所有参与运算的数字均为 0 到 231-1 之间的整数。
输入数据保证这一行只有0~9、+、*这12种字符。

输出描述:

输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。

 

示例1

输入

复制
1+1*3+4

输出

复制
8

说明

计算的结果为8,直接输出8。
本题主要思路便是把该算术式的数字存入栈中,同时一个个将符号也存入进去,因为乘法的优先大于加分,如果这个时遇到加分但是栈顶为乘法,这个时候就要取出栈顶元素,同时从数字栈内取出两个相乘再放入
这个操作要一直到栈顶不再是乘法时候。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string str;
    cin>>str;
    stack<int> nums;
    stack<char> tags;
    int l=0;
    for(int r=0;r<=str.size();r++)
    {
        if(str[r]=='+'||str[r]=='*')
        {
            long long temp;
            string h=str.substr(l,r-l);
            stringstream ss;
            ss<<h;
            ss>>temp;
            nums.push(temp%10000);
            if(!tags.empty())
            {
                char c=tags.top();
                if(c=='*'&&str[r]=='+')
                {
                    while(!tags.empty()&&tags.top()=='*')//注意如果发现了乘法便要一直乘
                    {
                        int a=nums.top();
                        nums.pop();
                        int b=nums.top();
                        nums.pop();
                        nums.push((((a%10000)*(b%10000)))%10000);
                        tags.pop();
                    }
                    tags.push(str[r]);

                }
                else
                {
                    tags.push(str[r]);
                }
            }
            else
            {
                tags.push(str[r]);
            }
            l=r+1;
        }
        
    }
    string h=str.substr(l);
    stringstream ss;
    long long temp;
    ss<<h;
    ss>>temp;
    nums.push(temp%10000);
    /*while(!tags.empty())
    {
        cout<<tags.top();
        tags.pop();
    }*/
    while(!tags.empty())
    {
        int a=nums.top();
        nums.pop();
        int b=nums.top();
        nums.pop();
        char c=tags.top();
        tags.pop();
        if(c=='+')
        {
            temp=(a+b)%10000;
        }
        else
        {
            temp=((a%10000)*(b%10000))%10000;
        }
        nums.push(temp);
    }
    cout<<nums.top()<<endl;
}

 

posted @ 2020-04-22 16:44  ___Charles  阅读(423)  评论(0)    收藏  举报