ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】表达式的值

2019-07-15 16:01:19  阅读:274  来源: 互联网

标签:运算 int 题解 len 括号 MAX 表达式


题目描述

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

  Failed to load picture

  运算的优先级是:

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

  2.“×”运算优先于“⊕”运算,即计算表达式时,先计算×运算,再计算⊕运算。

  例如:计算表达式A⊕B×C时,先计算B×C,其结果再与A做⊕运算。

  现给定一个未完成的表达式,例如_+(_×_),请你在横线处填入数字0或者1,请问有多少种填法可以使得表达式的值为0。

 

输入格式

  共2行:

  第一行为一个整数 L,表示给定的表达式中除去横线外的运算符和括号的个数。

  第二行为一个字符串包含L个字符,其中只包含“(”、“)”、“+”、“×”这4种字符,其中“(”、“)”是左右括号,“+”、“×”分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序给出了给定表达式中除去变量外的运算符和括号。

 

输出格式

  一行,包含一个整数,即所有的方案数。注意:这个数可能会很大,请输出方案数对10007取模后的结果。

 

输入样例

4

+(*)

 

输出样例

3

 

数据规模

  对于20%的数据,0≤L≤10。

  对于50%的数据,0≤L≤1000。

  对于70%的数据,0≤L≤10000。

  对于100%的数据,0≤L≤100000。

  对于50%的数据输入表达式中不含括号。

 

题解

  题目中给出的是中缀表达式,我们可以先转后缀表达式,然后补上数字的位,在模拟运算一遍这个表达式即可。

#include <iostream>
#include <cstdio>
#include <stack>

#define MAX_LEN (100000 + 5)

using namespace std;

const int mod = 10007;
int len;
char s[MAX_LEN];
stack <char> st;
char ns[MAX_LEN + MAX_LEN];
int nlen;
stack <int> n0, n1;

int main()
{
    scanf("%d%s", &len, s + 2);
    len += 2;
    s[1] = '(';
    s[len] = ')';
    ns[++nlen] = '_';
    for(register int i = 1; i <= len; ++i)
    {
        if(s[i] == '(')
        {
            st.push(s[i]);
        }
        else if(s[i] == ')')
        {
            while(st.top() != '(')
            {
                ns[++nlen] = st.top();
                st.pop();
            }
            st.pop();
        }
        else if(s[i] == '+')
        {
            while(st.top() != '(')
            {
                ns[++nlen] = st.top();
                st.pop();
            }
            st.push(s[i]);
            ns[++nlen] = '_';
        }
        else
        {
            while(st.top() == '*')
            {
                ns[++nlen] = st.top();
                st.pop();
            }
            st.push(s[i]);
            ns[++nlen] = '_';
        }
    }
    int u0, u1, v0, v1;
    for(register int i = 1; i <= nlen; ++i)
    {
        if(ns[i] == '_')
        {
            n0.push(1);
            n1.push(1);
            continue;
        }
        u0 = n0.top();
        n0.pop();
        v0 = n0.top();
        n0.pop();
        u1 = n1.top();
        n1.pop();
        v1 = n1.top();
        n1.pop();
        if(ns[i] == '+')
        {
            n0.push((u0 * v0) % mod);
            n1.push((u0 * v1 + u1 * v0 + u1 * v1) % mod);
        }
        else
        {
            n0.push((u0 * v0 + u0 * v1 + u1 * v0) % mod);
            n1.push((u1 * v1) % mod);
        }
    }
    printf("%d", n0.top());
    return 0;
}
参考程序

 

标签:运算,int,题解,len,括号,MAX,表达式
来源: https://www.cnblogs.com/kcn999/p/11189368.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有