表达式的值
对于1 位二进制变量定义两种运算:
运算的优先级是:
-
先计算括号内的,再计算括号外的。
-
“× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算。例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算。
现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字00或者11 ,请问有多少种填法可以使得表达式的值为00。
输入输出格式
输入格式:
共 2 行。
第1 行为一个整数 LL,表示给定的表达式中除去横线外的运算符和括号的个数。
第2 行为一个字符串包含 LL 个字符,其中只包含’(’、’)’、’+’、’*’这44 种字符,其中’(’、’)’是左右括号,’+’、’*’分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序给出了给定表达式中除去变量外的运算符和括号。
输出格式:
共1 行。包含一个整数,即所有的方案数。注意:这个数可能会很大,请输出方案数对1000710007取模后的结果。
利用栈求表达式的值
from :mfmdaoyou
栈先进后出的数据结构。在该程序中建有两个栈:一个用于存储运算符,还有一个用于存储操作数或运算结果。基本
过程是:
(1):首先设置操作数栈为空栈,设置运算符栈以‘#’为栈底元素(其优先级最低)。
(2):通过为栈内栈外运算符设置值而比較其优先级
(3):依次去找到表达式中的全部运算符和操作数,对于操作数直接入栈。运算符则和运算符栈的
栈顶运算进行比較优先级,若栈内优先级大,则进行对应操作并操作数和栈内运算符都出栈,若优先级相等仅仅需
栈内运算符出栈继续查找下一个运算符就可以,若栈内优先级低则栈外运算符入栈。依次循环知道分析完表达式中
的全部运算符和操作数就可以。
(4):最后在操作数栈中将仅仅会剩下唯一的一个元素,而该元素也将就会是所求表达式的值。
from: 她叫徐晓jie
由于中缀表示中有操作符的优先级问题,还有可加括号改变运算顺序的问题,所以对于编译程序来说,一般不使用中缀处理表达式。
下面讨论用后缀表达式求解表达式的值:
例:计算中缀表达式A+B*(C-D)-E/F对应的后缀表达式ABCD-*+EF/-,它的计算需要以下12步:
from: watsy
首先把中缀式转换为后缀式。
转换过程
1)若读入的是操作数,入到输出栈
2)读入的是闭括号,把操作栈中的运算符依次出栈,推入输出栈,一直遇到对应开括号为止,把开括号出栈
3)读入的开括号,进运算符栈
4)读入的是运算符,如果运算符栈优先级高,堆栈运算符出栈,出栈操作一直要进行到栈顶运算符优先级低为止,然后把新的运算符入栈
5)在读入操作符结束扣,把运算符栈中所有剩余运算符依次出栈,放入输出栈
6)计算输出堆表达式的
1 #include<stdio.h> 2 #include<iostream> 3 #include<cstdio> 4 using namespace std; 5 const int M=10007,N=100005; 6 int n,i,u[N],v[N],top,k; 7 char c[N],sta[N],ans[2*N]; 8 int main() 9 { 10 freopen("a.in","r",stdin); 11 freopen("a.out","w",stdout); 12 cin>>n; 13 for(int i=1;i<=n;i++) cin>>c[i]; 14 ans[++k]='.'; 15 for(i=1;i<=n;i++) 16 { 17 if(c[i]=='('||c[i]=='*') 18 sta[++top]=c[i]; 19 if(c[i]=='+') 20 { 21 while(sta[top]=='*') 22 ans[++k]=sta[top--]; 23 sta[++top]=c[i]; 24 } 25 if(c[i]==')') 26 { 27 while(sta[top]!='(') 28 ans[++k]=sta[top--]; 29 top--; 30 } 31 if(c[i]!='('&&c[i]!=')') 32 ans[++k]='.'; 33 } 34 while(top>0) 35 ans[++k]=sta[top--]; 36 for(i=1;i<=k;i++) 37 { 38 if(ans[i]=='.') 39 { 40 u[++top]=1; 41 v[top]=1; 42 } 43 if(ans[i]=='*') 44 { 45 top--; 46 u[top]=(u[top+1]*v[top]+u[top]*v[top+1]+u[top]*u[top+1])%M; 47 v[top]=v[top]*v[top+1]%M;//注意顺序,放前面u[ftp]先更新,但后面还要用原来的 48 } 49 if(ans[i]=='+') 50 { 51 top--; 52 v[top]=(u[top+1]*v[top]+u[top]*v[top+1]+v[top]*v[top+1])%M; 53 u[top]=u[top]*u[top+1]%M; 54 } 55 } 56 printf("%d",u[1]); 57 }