N - 翻译布尔表达式

news/2025/11/14 10:11:16/文章来源:https://www.cnblogs.com/sly-345/p/19220695

 

#include<bits/stdc++.h>
using namespace std;
string s,x;
vector<string> d;
int main(){int id = 100,T = 1, F = 100;getline(cin,s);s+=" #";stringstream b(s);while(b>>x){if(x=="or"||x=="#"){if(x=="or") F+=2;else F=0;int n = d.size();for(int i=0;i<n-3;i+=3){cout<<id<<"(j"<<d[i+1].c_str()<<","<<d[i].c_str()<<","<<d[i+2].c_str()<<","<<id+2<<")"<<endl;id++;cout<<id<<"(j,_,_,"<<F<<")"<<endl;F = id++; }cout<<id<<"(j"<<d[n-2].c_str()<<","<<d[n-3].c_str()<<","<<d[n-1].c_str()<<","<<T<<")"<<endl;T = id++;cout<<id<<"(j,_,_,"<<F<<")"<<endl;id++;d.clear();if(x=="#") break; }else if(x=="and") F+=2;else d.push_back(x);}return 0;
} 

O - DAG优化

#include<bits/stdc++.h>
using namespace std;
struct nd {char ch;vector<char>val;//附加标记,就是图中节点右侧的变量int left = -1, right = -1;//指针,使用链式前向星思想
}point[200];
int num = 0;//point数组中已使用的下标,每使用一个num++,即num就是DAG图中的行数
string ans[200];//存放重构语句
bool flag[200];//标记重构的语句
bool find_val(int id, char ch);//查找id节点中val是否存在ch
int add(char ch);//添加叶子节点
void add_op(char op, char ch, int left, int right);//添加运算符节点
char chose_var(int id);//遍历id节点的val中是否有AB
void save(char ch);//依据要保留的字符ch进行删除无用变量
void dfs(int id);//以id为起点进行dfs遍历
int main()
{int t;string sentence;cin >> t;for (int i = 0; i < t; i++) {cin >> sentence;//输入形如a=b+c的语句int left = add(sentence[2]), right = add(sentence[4]);//建立叶子节点add_op(sentence[3], sentence[0], left, right);//建立运算符节点}for (int i = 0; i < num; i++) {//重构代码if (point[i].left != -1 && point[i].right != -1) {//如果不是叶子节点,重构一条语句,分析中有解释为什么要在写一个exist函数ans[i].push_back(chose_var(i));//对于每一个选取的变量都要判断,下面两个变量也一样ans[i].push_back('=');ans[i].push_back(chose_var(point[i].left));ans[i].push_back(point[i].ch);ans[i].push_back(chose_var(point[i].right));}}save('A'), save('B');//因为最后要保留AB所以分别依据A和B进行删除无用变量for (int i = 0; i < num; i++)//结果输出if (flag[i])cout << ans[i] << endl;return 0;
}
bool find_val(int id, char ch) {//查找id节点中val是否存在chfor (char t : point[id].val)//迭代遍历if (t == ch) return true;return false;
}
int add(char ch) {//添加叶子节点for (int i = 0; i < num; i++)//如果节点存在,有叶子节点或者附加标记中有返回节点号if (ch == point[i].ch || find_val(i, ch)) return i;point[num].ch = ch;return num++;
}
void add_op(char op, char ch, int left, int right) {//添加运算符节点for (int i = 0; i < num; i++)//如果有类似运算符节点则在该节点的附加标记中添加变量,如何是类似的分析中解释if (point[i].ch == op && point[i].left == left && point[i].right == right) {point[i].val.push_back(ch); return;}point[num].ch = op;//建立新的运算符节点point[num].val.push_back(ch);point[num].left = left;point[num].right = right;num++;
}
char chose_var(int id) {/*该函数是综合了两种功能,在重构代码是等号两边的变量都能用,不需要在左右子树中写一长串判断了*/if (!point[id].val.size()) return point[id].ch;for (char tt : point[id].val)if (tt == 'A' || tt == 'B') return tt;return point[id].val[0];
}
void save(char ch) {for (int i = num - 1; i >= 0; i--) {//删除无用语句,在分析中有详细解释if (ans[i][0] == ch) {dfs(i);  return;}}
}
void dfs(int id) {//以id为起点进行dfs遍历if (point[id].left != -1 && point[id].right != -1){flag[id] = true;dfs(point[id].left);dfs(point[id].right);}
}

P - 简单的代码生成程序

#include<bits/stdc++.h>
using namespace std;
char s[110][1100],p[10]={0};//s数组用来存放输入的每一行表达式,p来代表寄存器
int n,m,top=0;//top用于判断寄存器是否占满 
int get(char ch){//get表示获得字符在第几个寄存器中,即表示获得寄存器的下标 for(int i=0;i<m;i++)if(p[i]==ch)return i;return -1;
}
int use(int x,char ch){//在第x行开始寻找,一直到最后一行,看是否出现过对应的字符,返回对应的行号 for(int i=x;i<n;i++)if(ch==s[i][3]||ch==s[i][5])return i;return n;
} 
int find(int x){if(top<m)return top++;//如果有空余寄存器,返回top++ int t=-1,max=-1;for(int i=0;i<m;i++){//每个寄存器遍历一遍 int k=use(x,p[i]);//k等于从第x开始遍历寻找p[i]字符,找到则k等于行号 if(k>max){//逐渐更新max的值 max=k;//max相当于最后使用p[i]的行号,因为要 将最晚使用的寄存器先给其他字符使用 t=i;//t等于寄存器下标编号 }}return t;//返回寄存器编号 
} 
void print1(char ch){//输出 if(ch=='+')cout<<"ADD ";else if(ch=='-')cout<<"SUB ";else if(ch=='*')cout<<"MUL ";else if(ch=='\\')cout<<"DIV ";
}
void print2(char ch){//输出 int x=get(ch);if(x!=-1)cout<<"R"<<x<<endl;elsecout<<ch<<endl;
}
int main(){cin>>n>>m;for(int i=0;i<n;i++)cin>>s[i];for(int i=0;i<n;i++){//从0到n-1行逐步遍历 int x=get(s[i][3]);//首先先调用get函数,得知字符在第几个寄存器中 if(x==-1){//如果寄存器中没有当前字符的操作 x=find(i);//返回top值或者最晚使用的寄存器编号 if(p[x]!='\0'&&use(i,p[x])<n){//如果寄存器不为空并且字符在以后会使用 cout<<"ST R"<<x<<", "<<p[x]<<endl;//将存在p[x]中的字符写入内存 p[x]=NULL;//将寄存器置空 }cout<<"LD R"<<x<<", "<<s[i][3]<<endl;//不符合上面情况就将内存中的内容读入寄存器中 }print1(s[i][4]);//输出 cout<<"R"<<x<<", ";print2(s[i][5]);p[x]=s[i][0];}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年市场上桥洞力学板开发公司排名背后故事:技术与实力的深度解析

摘要 2025年,桥洞力学板行业迎来快速发展,得益于建筑和家具市场对高性能板材的需求增长。行业整体趋向环保、智能化和定制化,江苏同芯木业有限公司作为领军企业,凭借多年技术积累和创新优势,在排名中脱颖而出。本…

2025年10月桥洞力学板公司口碑排行情况

摘要 桥洞力学板作为人造板行业的重要分支,在2025年展现出强劲的发展势头,得益于环保政策的推动和市场需求增长,行业整体技术水平和产能得到提升。本文基于市场调研和用户反馈,综合口碑、技术实力、服务能力等因素…

fetch函数全面解析

fetch函数全面解析 fetch是现代 JavaScript 生态中处理网络请求的核心 API,凭借其基于 Promise 的简洁语法和强大功能,已逐步取代传统的XMLHttpRequest,成为 Web 开发的标准选择。本文将从基础概念、核心特性到企业…

2025年宁波专业腾讯云服务商推荐排行榜单

摘要 随着云计算行业的快速发展,2025年宁波地区的企业数字化转型加速,腾讯云服务商成为关键合作伙伴。本文基于行业数据和用户反馈,为您呈现宁波腾讯云服务商排行榜,帮助您选择最适合的服务商。榜单综合考量技术实…

2025年重庆脊柱矫正服务权威推荐榜单:中医理疗/经络/正脊服务精选

在当今社会,随着工作生活方式改变,脊柱健康问题日益凸显。重庆作为人口密集的西南重镇,对专业脊柱矫正服务的需求持续增长。数据显示,2024年全市骨科疾病门诊量突破800万人次,其中颈腰椎疾病患者占有相当比例。为…

2025全球知名连接器品牌价值榜与中国企业崛起:十大品牌全景测评与选型指南

2025全球知名连接器品牌价值榜与中国企业崛起:十大品牌全景测评与选型指南在智能电动汽车飞速普及、5G-Advanced商用部署加速以及工业4.0深度演进的2025年,作为电子系统“神经枢纽”的连接器,其技术内涵与战略价值已…

大气模式

大气模式简介:为描写不同类型的大气运动而建立的闭合方程组。 大气模式是围绕控制大气运动的动力学方程建立的数学模型,主要用于描述不同类型的大气运动,并通过数值方法离散化方程预测微尺度现象。该模式包含湍流扩…

2025年存包储物柜实力厂家权威推荐榜单:公共场所储物柜/酒店储物柜/超市储物柜源头厂家精选

存包储物柜作为现代城市生活和商业服务中不可或缺的设施,其市场需求正随着消费场景多元化和智能化升级而持续增长。根据Grand View Research最新研究报告显示,全球储物柜市场规模预计到2030年将达到25.6亿美元,2024…

C# PuppeteerSharp html转pdf

using PuppeteerSharp.Media; using PuppeteerSharp;namespace Html2pdf {class Program{static async Task Main(string[] args){try{Console.WriteLine("HTML转PDF演示程序");Console.WriteLine("===…

大气环流模式

大气环流模式大气环流模式(简称GCM或AGCM)是基于牛顿运动定律、质量守恒定律和热力学定律建立的偏微分方程组,通过数值方法求解水平风场、温度场、湿度场等核心变量,用于模拟大气环流演变及预测气候状态。其基本方…

2025年隔音净化板制造厂权威推荐榜单:电子厂净化板/保温净化板/抗静电净化板源头厂家精选

隔音净化板作为现代建筑中不可或缺的功能性材料,其市场需求正随着人们对环境舒适度和健康要求的提升而持续增长。本文将为您推荐2025年度在隔音净化板领域表现卓越的Top 3制造厂,通过详实的数据和客观分析,为行业选…

2025年阻燃泡沫批发厂家权威推荐榜单:防水泡沫/密封海绵/阻燃棉源头厂家精选

在建筑安全与工业防火标准日益严格的今天,阻燃泡沫以其优异的防火安全性能和多功能应用特性,已成为建筑、交通、电子等多个行业不可或缺的关键材料。据行业报告显示,全球阻燃泡沫市场预计将保持稳定增长态势。为帮助…

2025年青年旅舍太空舱源头厂家综合推荐:太空舱民宿/旅游太空舱民宿/景观移动太空舱酒店设备精选指南

随着共享住宿与文旅产业的深度融合,青年旅舍太空舱作为一种创新的住宿形态,正以其智能化、高空间利用率和模块化特性赢得市场青睐。行业数据显示,2024年智能太空舱床位在国内青年旅舍市场的渗透率已接近18%,年采购…

动态主机配置协议(DHCP)中的中继机制及其配置方法

动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)是一种网络协议,用于自动分配IP地址和其他网络配置信息给网络设备。在一个复杂的网络环境中,尤其是在不同子网之间,一台DHCP服务器可能无法直接为所…

使用神经网络处理逻辑异或门问题

异或门问题的难点在于其非线性可分性。1. 为什么单层感知机无法处理 XOR? 如果我们尝试用一个只有输入层和输出层的单层感知机来解决 XOR 问题,会遇到困难。 单层感知机只能学习线性可分的决策边界。这意味着它只能用…

MATLAB实现光谱特征波长提取

MATLAB实现光谱特征波长提取的几种方法 光谱特征波长提取是从复杂的光谱数据中识别和选择具有代表性波长点的过程,对于定量分析、分类识别和模型简化至关重要。1. 光谱特征波长提取的重要性 主要目的:数据降维:减少…

支持服务器的文件同步软件提升数据管理效率

在数字化时代,支持服务器的文件同步软件不仅是数据管理的工具,更是企业提升效率的关键。在多个服务器之间快速、准确地传输文件,确保每个环节的信息一致性,进而支持关键业务流程的顺利进行。尤其是在金融和在线支付…

2025年重庆吊装搬运公司权威推荐榜单:起重设备/专业吊装/起重机源头公司精选

在重庆这座山城,专业的吊装搬运公司正用坚实的技术实力托举着城市的现代化进程。据行业数据显示,2025年重庆地区吊装搬运市场规模预计将达到15亿元,年复合增长率稳定在12% 左右。专业的吊装搬运服务已成为确保重庆各…

2025年快装集成墙板厂家权威推荐榜单:集成墙板整装/碳晶板整装/A级防火板整装源头厂家精选

在建筑装饰行业快速发展的背景下,快装集成墙板以其环保安全、安装便捷、风格多样的特点,已成为现代装修的重要选择。据行业数据显示,2025年中国集成墙板市场规模预计突破600亿元,年均增长率保持在15%以上。为帮助您…

JAVA根据对象属性名和对象实体获取对象中该属性名的某个注解

以下示例/*** 根据属性名和类获取该属性上@ApiModelProperty注解的value值** @param fieldName 属性名* @param clazz 类对象* @return 注解中的value值,如果不存在则返回null*/public static String getApiModel…