首页 > 其他分享 >CSP2022-T3(逻辑表达式)

CSP2022-T3(逻辑表达式)

时间:2022-12-01 12:44:13浏览次数:70  
标签:a1 后缀 CSP2022 栈顶 T3 运算符 b1 表达式

【题目来源】http://oj.tfls.net/d/lnzt/p/15

【题目分析】需要先将题目中的中缀表达式转成后缀表达式计算,计算时使用一个三元结构体(v,a,b),分别为值,&运算短路的次数,|运算短路的次数,计算时可以分为四种情况:(0,a1,b1)&(v,a2,b2)=(0,a1+1,b1);(1,a1,b1)&(v,a2,b2)=(v,a1+a2,b1+b2); (0,a1,b1)|(v,a2,b2)=(1,a1+a2,b1+b2);(1,a1,b1)|(v,a2,b2)=(1,a1,b1+1);

【中缀转后缀规则】

创建字符栈,扫描中缀表达式。

1.如果是数字,直接成为后缀表达式的一部分;

2.如果是 “(”,进栈;

3.如果是“)”,则从栈顶起,依次将栈中运算符出栈成为后缀表达式的一部分,直到碰到“(”。将栈中“(”出栈,直接消失。

4.如果是运算符,则判断其与栈顶运算符的优先级,若优先级大于栈顶运算符,则进栈;若优先级小于等于栈顶运算符,依次退出栈顶运算符成为后缀表达式的一部分,直到当前运算任优先级大于栈顶运算符,然后将当前运算符放入栈中;

5.扫描结束后,如果栈不为空,将栈中元素依次出栈成为后缀表达式的一部分。

原文链接:https://blog.csdn.net/qq_43290883/article/details/125633103

【后缀表达式计算规则】

创建操作数栈,扫描后缀表达式。

1.如果是数字,入栈。

2.如果是运算符,则从栈顶弹出两个元素,依次为右操作数和左操作数,按照运算规则进行计算,将计算结果入栈。

3.扫描结束后栈顶元素即为表达式结果。

【代码】

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 //获取优先级 
 4 int getyxj(char c) {
 5     if(c=='(') return 0;
 6     if(c=='|') return 1;
 7     if(c=='&') return 2;
 8 }
 9 //中缀转后缀 
10 string zztohz(string str) {
11     stack<char> st;   
12     string hz;
13     for(int i=0; i<str.size(); i++) {
14         if(str[i]=='0'||str[i]=='1')  //规则1 
15             hz+=str[i];
16         else if(str[i]=='(')  //规则2
17             st.push(str[i]);
18         else if(str[i]==')') {  //规则3
19             while(st.top()!='(') {
20                 hz+=st.top();
21                 st.pop();
22             }
23             st.pop();
24         } else {  //规则4
25             while(!st.empty()&&getyxj(str[i])<=getyxj(st.top())) { 
26                 hz+=st.top();
27                 st.pop();
28             }
29             st.push(str[i]);
30         }
31     }
32     while(!st.empty()) {  //规则5
33         hz+=st.top();
34         st.pop();
35     }
36     return hz;
37 }
38 struct node {
39     int v; //value
40     int a; //短路次数 &
41     int b; //短路次数 |
42 };
43 //计算后缀表达式 
44 node js(string str) {
45     stack<node> st;
46     node zuo,you,now,jg;
47     for(int i=0; i<str.size(); i++) {
48         if(str[i]=='0'||str[i]=='1') {  //规则1
49             now.v=str[i]-'0';
50             now.a=0;
51             now.b=0;
52             st.push(now);
53         } else { //规则2
54             you=st.top();
55             st.pop();
56             zuo=st.top();
57             st.pop();
58             if(str[i]=='&'&&zuo.v==0) {
59                 jg.v=0;
60                 jg.a=zuo.a+1;
61                 jg.b=zuo.b;
62             }
63             if(str[i]=='&'&&zuo.v==1) {
64                 jg.v=you.v;
65                 jg.a=zuo.a+you.a;
66                 jg.b=zuo.b+you.b;
67             }
68             if(str[i]=='|'&&zuo.v==0) {
69                 jg.v=you.v;
70                 jg.a=zuo.a+you.a;
71                 jg.b=zuo.b+you.b;
72             }
73             if(str[i]=='|'&&zuo.v==1) {
74                 jg.v=1;
75                 jg.a=zuo.a;
76                 jg.b=zuo.b+1;
77             }
78             st.push(jg);
79         }
80     }
81     return jg;
82 }
83 int main() {
84     string s;
85     getline(cin,s);
86     node jg=js(zztohz(s));
87     cout<<jg.v<<endl;
88     cout<<jg.a<<" "<<jg.b;
89     return 0;
90 }

 

标签:a1,后缀,CSP2022,栈顶,T3,运算符,b1,表达式
From: https://www.cnblogs.com/tflszxl/p/16941083.html

相关文章

  • C#通过 Expression 表达式获取、设置属性名称、属性值
    Expression获取,设置属性的值有时候,业务需求,需要根据属性名称设置属性的值或者根据属性名称获取属性的值,原生的反射实现比较简单,我想用ExpressionTree来实现,写成拓展方......
  • Cron表达式速查,1张表记清楚
    Cron表达式是一个字符串,定义时间规则,由6或7个时间域组成,空格分隔。1张表整理清楚含义和规则,并举例常用表达式,放手边速查。Cron表达式时间域序号含义取值范围特殊字......
  • mac sublime text3-快捷键
    cmd+n新建页面cmd+数字键切换到对应页面cmd+p搜索跳转到对应页cmd+w关闭页面cmd+j合并一行cmd+d选中当前单词,继续敲可以选中多个cmd+l选中当前行cmd+z撤销......
  • 算法竞赛入门【码蹄集进阶塔335题】(MT3330-3335)
    算法竞赛入门【码蹄集进阶塔335题】(MT3330-3335)(文章目录)前言为什么突然想学算法了?>用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。在绝......
  • 栈实现表达式求值
    通过前两天的博客园,可以知道我最近在疯狂补作业,这是我在数据结构实验课遇到的一个题,我通过搜寻相关知识点,理清了后缀表达式的转化过程题目要求:使用键盘输入数学表达式(含......
  • 表达式求值
    给定一个表达式,其中运算符仅包含 +,-,*,/(加减乘整除),可能包含括号,请你求出表达式的最终值。#include<iostream>#include<stack>#include<unordered_map>usingn......
  • aop切点定义表达式详解
    目录1.execution2.within3.this4.target5.args6.bean7.@args8.@target9.@within10.@annotation11.组合表达式1.execution可以匹配到方法级别格式如下:execution(方法访......
  • Lambda表达式简介
    什么是Lambda?:java8的新特性。是个匿名函数。为什么使用Lambda?:可以对接口进行非常简洁的实现。使用Lambda表达式来实现接口Comparatorcomparator3=(a,b)->a-b;......
  • go 正则表达式
    funcmain(){ line:="2022/11/2519:32<DIR>目录" reg:=regexp.MustCompile(`([\d/]+)\s+(\d+:\d+)\s+(<DIR>)\s+(.*)`) ifreg==nil{ panic(......
  • 使用正则表达式处理字符串
    参考代码:mportrestrInput='310.1'strList=re.findall('^[\-\+]?\d+\.?\d+$',strInput)print(strList)strInput2='aa310.0.1'strList2=re.search('[\-\+......