数据结构P1981 表达式求值

Posted osea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构P1981 表达式求值相关的知识,希望对你有一定的参考价值。

题目描述

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

输入格式

一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“++”和乘法运算符“×”,且没有括号,所有参与运算的数字均为 0 到 2^31之间的整数。

输入数据保证这一行只有09、+、×这 1212种字符。

输出格式

一个整数,表示这个表达式的值。

注意:当答案长度多于 4 位时,请只输出最后4 位,前导0不输出。

输入输出样例

输入 #1
1+1*3+4
输出 #1
8
输入 #2
1+1234567890*1
输出 #2
7891
输入 #3
1+1000000003*1
输出 #3
4

 

 

【题解】

  经典问题,利用栈直接模拟即可,过程中需要取模运算即可。

 

技术图片
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<stack>
 6 using namespace std;
 7 const int N = 2e6+10;
 8 const int mod = 10000;
 9 char s[N];
10 stack <int> num ;
11 
12 int Mul(int u ,int v )
13     return u * v % mod ;
14 
15 int Add(int u ,int v )
16     int res = u+v ;
17     if( res >= mod ) res -= mod ;
18     return res ;
19 
20 void read()
21     int len = strlen(s) , i=1 ;
22     int x = s[0] - 0 ;
23     bool mul = false ;
24     while( i < len )
25         while( 0 <= s[i] && s[i] <= 9 )
26             x = x * 10 + s[i] - 0 ;
27             i ++ ;
28         
29         if( x >= 10000 ) x%=10000;
30         num.push(x);
31 
32         if( mul )
33             int t1 = num.top() ;
34             num.pop();
35             int t2 = num.top() ;
36             num.pop();
37             x = Mul(t1,t2);
38             num.push(x);
39             mul = false;
40         
41 
42         if( s[i] == + || s[i] ==* ) 
43             mul = (s[i] ==*) ;
44         
45         x = 0 ;
46         i++;
47     
48     int ans = 0 ;
49     while( !num.empty() )
50         ans = Add( (int)num.top() , ans );
51         num.pop() ;
52     
53     printf("%d\n",ans);
54 
55 int main()
56 
57     scanf("%s",s);
58     //printf("%s\n",s);
59     read();
60     return 0;
61 
View Code

 

以上是关于数据结构P1981 表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

洛谷p1981 表达式求值

C语言 任意表达式求值。(栈的应用

C++:算术表达式求值

C语言编程-逆波兰表达式求值

[数据结构]表达式求值

求C++ 表达式求值得程序,最好简单说明数据结构和大致方法