牛客算法周周练3 - 表达式求值(模拟、栈)

牛客算法周周练3 - 表达式求值(模拟、栈)

链接:https://ac.nowcoder.com/acm/contest/5338/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

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

输入描述:

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

输出描述:

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

 

示例1

输入

1+1*3+4

输出

8

说明

计算的结果为8,直接输出8。

示例2

输入

1+1234567890*1

输出

7891

说明

计算的结果为1234567891,输出后4位,即7891。

示例3

输入

1+1000000003*1

输出

4

说明

计算的结果为1000000004,输出后4位,即4。

备注:

对于30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

 

学数据结构的栈的时候应该见过后缀表达式,这个就是一个简单的中缀表达式

因为只有乘和加, 所以我们遇到乘法直接算, 剩下的数字存到栈里, 最后栈里的全做加法运算,加完即可

因为只保留后面四位,要%1e4

 

#include <bits/stdc++.h>
typedef long long LL;
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9+7;
const int maxn = 1e5+10;
using namespace std;

string str;
stack<int> sk;

int main()
{
    #ifdef DEBUG
    freopen("sample.txt","r",stdin); //freopen("data.out", "w", stdout);
    #endif
    
    cin>>str;
    for(int i=0;i<str.size();)
    {
        if(isdigit(str[i]))
        {
            LL num = 0;
            while(isdigit(str[i]))
            {
                num = num*10+str[i]-'0';
                num %= 10000;
                i++;
            }
            sk.push(num);
        }
        else if(str[i]=='*')
        {
            LL num = 0;
            i++;
            while(isdigit(str[i]))
            {
                num = num*10+str[i]-'0';
                num %= 10000;
                i++;
            }
            int t = sk.top(); sk.pop();
            sk.push(num*t%10000);
        }
        else if(str[i]=='+') i++;
    }
    while(sk.size()>1)
    {
        int num1 = sk.top(); sk.pop();
        int num2 = sk.top(); sk.pop();
        sk.push((num1+num2)%10000);
    }
    cout<<sk.top()%10000<<"\n";
    
    return 0;
}

 

 

跟表达式有关的用Python计算超级简单

import sys #该sys模块提供对解释器使用或维护的某些变量以及与解释器强烈交互的功能的访问。它提供有关python解释器的常量,函数和方法的信息。它可以用于操纵Python运行时环境。
sys.setrecursionlimit(1000000) #sys.setrecursionlimit()方法用于将Python解释器堆栈的最大深度设置为所需的限制。此限制可防止任何程序进入无限递归,否则无限递归将导致C堆栈溢出并使Python崩溃。
print(eval(input().strip()) % 10000) #strip用于去除首尾空格或者回车符

 

对比:

 

-

posted @ 2020-04-30 13:59  jiamian22  阅读(548)  评论(0编辑  收藏  举报