【数据结构】P1981 表达式求值

题目描述

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

输入格式

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

输入数据保证这一行只有0−9、+、×这 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 }

原文地址:https://www.cnblogs.com/Osea/p/11410338.html

时间: 2024-10-28 22:24:58

【数据结构】P1981 表达式求值的相关文章

数据结构例程——表达式求值(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值. 例:用户输入一个包含"+"."-"."*"."/".正整数和圆括号的合法数学表达式,计算该表达式的运算结果. 解答: #include <stdio.h> #include <stdlib.h> #define MaxOp 100 #define MaxSize 100 struct //设定运算符优先级 { char

数据结构之表达式求值(C++版)

#include <windows.h>#include <iostream>#include <stdlib.h>#define MAXBUFFER 10#define MAXLISTSIZE 100 //预设的存储空间最大容量using namespace std; typedef struct{ char *base; //存储空间基址 int *elem; int top; //栈顶指针 int stacksize; //允许的最大存储空间以元素为单位}Stac

洛谷p1981 表达式求值

#include <iostream> #include <cstdio> #include <cstring> using namespace std; char s[100007]; typedef long long ll; ll numSt[100007],opSt[100007],ans[63]; int main(){ while(~scanf("%s",s)){ int numTail=0,opTail=0,len=strlen(s),

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

C++表达式求值(利用数据结构栈)

唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的表 达式)的简单计算器程序.刚把两个程序对照了一下.感触还是挺深的,同一时候也再一次体现了数据结构在程序设计 中的重要性. 曾经的那个程序有漏洞并且逻辑复杂,所以就不提了,仅仅说说如今改进后的程序,其思想主要是用到了 栈先进后出的数据结构.在该程序中建有两个栈:一个用于存储运算符,还有一个用于存储操

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

C++与数据结构 -- stack实现表达式求值[注释版]

有好多朋友评论以前的那篇博文说:代码中间没有注释.由于课程一直比较紧张,所以答应的注释直到今天才写, 发表出来,与大家共享! #include <map> #include <stack> #include <string> #include <iostream> #include <fstream> using namespace std; //为+,-,*,/运算符 设定优先级 map<char,int> priority; vo

数据结构 表达式求值

实现表达式求值,以及表达式中括号是否匹配. 实现方法,建立两个栈,一个用来存放操作数,一个用来存放运算符.判断运算符优先级来确定什么时候出栈,利用一个数组去表示优先级 头文件代码如下: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <iostream> #include <string.h> using namespace std; template<class Type> class Stack