• 表达式的值


    对于1 位二进制变量定义两种运算:

    运算的优先级是:

    1. 先计算括号内的,再计算括号外的。

    2. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算。例如:计算表达式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 }
  • 相关阅读:
    教你在Linux用飞信(fetion)免费发短信
    date 和 hwclock 命令 (RTC用的着)
    同学会催生“恐聚族” 攀比成风成为炫耀展示会
    35款基于terminal的Linux应用
    探访山东各地旱情 田里麦苗用手一搓成粉末
    多城市近期将出台楼市限购细则 全面限购第三套
    Linux下刻录光盘—cdrecord
    RHEL 6教程:使用本地光盘做yum源
    RHEL6 root登陆问题
    初学者学习LINUX之困惑?方向迷失?GUI?
  • 原文地址:https://www.cnblogs.com/lcan/p/9788137.html
Copyright © 2020-2023  润新知