P1310 表达式的值 (表达式计算)

题目链接

解法:

 1 #include <bits/stdc++.h>
 2 # define LL long long
 3 using namespace std;
 4
 5 const int mod=10007;
 6 stack<char> ope;
 7 stack<int> one;
 8 stack<int> zero;
 9
10 void calc(){
11     char o=ope.top();
12     ope.pop();
13     int one1=one.top();
14     one.pop();
15     int one2=one.top();
16     one.pop();
17     int zero1=zero.top();
18     zero.pop();
19     int zero2=zero.top();
20     zero.pop();
21     int t1;
22     int t0;
23     if(o==‘*‘){
24         t1=(one1*one2)%mod;
25         t0=((one1*zero2)%mod+(one2*zero1)%mod+(zero1*zero2)%mod)%mod;
26     }else {
27         t1=((zero1*one2)%mod+(one1*zero2)%mod+(one2*one1)%mod)%mod;
28         t0=(zero1*zero2)%mod;
29     }
30     one.push(t1);
31     zero.push(t0);
32 }
33
34 int main(){
35     int L;
36     cin>>L;
37     string s;
38     cin>>s;
39     s=‘(‘+s+‘)‘;
40
41     for(int i=0;i<s.size();++i){
42         if(s[i]==‘(‘){
43             ope.push(s[i]);
44             if(s[i+1]!=‘(‘){
45                 one.push(1);
46                 zero.push(1);
47             }
48         }else if(s[i]==‘+‘){
49             while(ope.top()!=‘(‘){
50                 calc();
51             }
52             ope.push(s[i]);
53             if(s[i+1]!=‘(‘){
54                 one.push(1);
55                 zero.push(1);
56             }
57         }else if(s[i]==‘*‘){
58             ope.push(s[i]);
59             if(s[i+1]!=‘(‘){
60                 one.push(1);
61                 zero.push(1);
62             }
63         }else if(s[i]==‘)‘){
64             while(ope.top()!=‘(‘){
65                 calc();
66             }
67             ope.pop();
68         }
69     }
70     printf("%d", zero.top());
71     return 0;
72 }

2. 先转换成后缀表达式,再计算

 1 #include <bits/stdc++.h>
 2 # define LL long long
 3 using namespace std;
 4
 5 const int mod=10007;
 6 stack<char> ope;
 7 stack<int> one;
 8 stack<int> zero;
 9
10
11 int main(){
12     string s;
13     int L;
14     cin>>L;
15     cin>>s;
16     string str;
17     //补全需要填数的位置
18     for(int i=0;i<L;++i){
19         if(s[i]==‘(‘) {
20             str+=‘(‘;
21         }else {
22             if(i==0 || (i>0 && s[i-1]!=‘)‘)){
23                 str+=‘n‘;
24             }
25             str+=s[i];
26         }
27     }
28     if(str[str.size()-1]==‘+‘ || str[str.size()-1]==‘*‘){
29         str+=‘n‘;
30     }
31
32     //中缀转后缀
33     vector<char> suff;
34     for(int i=0;i<str.size();++i){
35         if(str[i]==‘n‘){
36             suff.push_back(str[i]);
37         }else if(str[i]==‘(‘ || str[i]==‘*‘){
38             ope.push(str[i]);
39         }else if(str[i]==‘+‘){
40             while(!ope.empty() && ope.top()==‘*‘){
41                 ope.pop();
42                 suff.push_back(‘*‘);
43             }
44             ope.push(str[i]);
45         }else{
46             while(!ope.empty() && ope.top()!=‘(‘){
47                 suff.push_back(ope.top());
48                 ope.pop();
49             }
50             ope.pop();
51         }
52     }
53     while(!ope.empty()){
54         suff.push_back(ope.top());
55         ope.pop();
56     }
57
58     for(int i=0;i<suff.size();++i){
59         if(suff[i]==‘n‘){
60             one.push(1);
61             zero.push(1);
62         }else if(suff[i]==‘+‘){
63             int o1=one.top(); one.pop();
64             int o2=one.top(); one.pop();
65             int z1=zero.top(); zero.pop();
66             int z2=zero.top(); zero.pop();
67             int t1=((o1*z2)%mod+(z1*o2)%mod+(o1*o2)%mod)%mod;
68             int t0=(z1*z2)%mod;
69             one.push(t1);
70             zero.push(t0);
71         }else if(suff[i]==‘*‘){
72             int o1=one.top(); one.pop();
73             int o2=one.top(); one.pop();
74             int z1=zero.top(); zero.pop();
75             int z2=zero.top(); zero.pop();
76             int t1=(o1*o2)%mod;
77             int t0=((o1*z2)%mod+(z1*o2)%mod+(z1*z2)%mod)%mod;
78             one.push(t1);
79             zero.push(t0);
80         }
81     }
82     printf("%d", zero.top());
83     return 0;
84 }

原文地址:https://www.cnblogs.com/FEIIEF/p/12259510.html

时间: 2024-10-08 02:18:43

P1310 表达式的值 (表达式计算)的相关文章

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

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

洛谷P1310 表达式的值

P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算. 现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字0 或者1 ,请问有多少种填法可以使得表达式的值为0 . 输入输出格式 输入格式: 输入文件名为exp.in ,共 2 行. 第1 行为一个整数 L,表示

stack计算表达式的值

9.52 使用stack对象处理带圆括号的表达式.遇到左圆括号时,将其标记下来.当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈. 接着在stack对象中压入一个值,用以表明这个用一对圆括号括起来的表达式已经被替换. 程序如下: #include<iostream> #include<stack> #include<string> using namespace std; int main() { sta

利用栈计算算数表达式的值

先将中缀表达式利用栈转换为后缀表达式,然后再利用栈由后缀表达式计算算数表达式的值,具体代码如下: #include <iostream> using namespace std; #include <string> #include <vector> #include <stack> enum Type { OP_NUM, OP_SYMBOL, }; enum Operat { ADD, SUB, MUL, DIV, }; struct Cell { Typ

NYOJ--128--前缀式计算(表达式求值)

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每

算法_计算输入的算术表达式的值.

例如:如果输入:( ( 1 + 2 ) * ( 3 + ( 4 * 5 ) ) )可以计算出输入的字符串所对应的算术表达式的值.我们支持运算符+,-,*,/,和一个一元运算abs,可以用一个简单的算法获取这个算术表达式的值: 我们用两个栈(一个用于保存操作符,一个用于保存操作数).表达式由括号,运算符和操作数组成.我们按照以下四种情况对于这个实体送入栈处理: 1.将操作数压入操作数栈 2.将运算符压入运算符栈 3.忽略左括号 4.如果碰到右括号,弹出一个运算符,如果运算符是abs以外的运算符,弹

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

异常: 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值 原因: 如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常.您可以使用 try-catch 语句捕获此异常.Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件.不执行 Response.End 后面的代码行.此问题出现在

1,由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

ylbtech-Error-WebForm: 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值. {由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值.} 1.A,错误代码返回顶部 Tip:{由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值.} 1.B,出错原因分析返回顶部 1.C,相关解决方法返回顶部 作者:ylbtech出处:http://ylbtech.cnblogs.com/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此

未能计算表达式的值

不知道为什么,越是上线,越是莫名其妙的出很多问题 环境:vs2013 调试问题的时候,监视不管用,不论什么监视值都是:未能计算表达式的值,这尼玛要急死人. 1. 项目是debug的啊,代码应该没有任何优化才对啊.之前还能调试来着. 2. 代码明显没有问题,即便是有问题也有异常捕捉.显然也不是代码的问题 3. 查了查也没有具体尝试,但是从各种现象上分析,应该是环境中出了什么问题,尼玛肯定重启下iis就可以了. 重启iis, ok.求解为什么会出此问题.问题原因在哪里.解决方法. 未能计算表达式的值