表达式相关(一)操作数栈、运算符栈

NOIP2013普及组T2

只有加法和乘法的表达式

思考:
使用tok来存放操作数或操作符(在编译器词法分析中称之为token,故简写为tok);输入只有一行可以用fgets,不知道题目给的输入文件有没有换行(fgets是会读入换行符的),所以还要加个判断,不然存放的时候会把换行符也当做运算符

对于2+3+...的表达式,读到2+3之后可以直接先算出5,结果是与5+...等价的;然而读到2+3...的表达式,需要先计算3...后面的内容,因为乘法的优先级比加法要高;故只读到2+3的时候不能先做计算,反之读到2*3可以先算。

每次读到操作数肯定要进栈;读到操作符,则根据优先级进行判断和计算;因此需要两个栈

一个简单的便于理解的小图示


大致推断出过程:

解析token
若为操作数则入栈
若为运算符:
若运算符栈为空,则将当前运算符入栈
若当前运算符优先级高于栈顶运算符,则将当前运算符入栈
否则不断循环,直至运算符栈为空或者当前运算符优先级高于栈顶运算符:
栈顶两个操作数出栈
栈顶运算符出栈
将两个操作数进行计算,再进栈
循环结束,将当前运算符入栈

实际写代码时考虑到判断运算符栈为空比较困难,需要一个哨兵;

大致长这样,关于括号的事情后面再写

#include<bits/stdc++.h>
using namespace std;
char tok[100000][20];
int tok_max=0;
char s[500000];int calc(char op,int num1,int num2){assert(op=='+'||op=='*');if(op=='+')return num1+num2;if(op=='*')return num1*num2;
}int priority(char op){if(op=='*')return 2;if(op=='+')return 1;
}
int main(){fgets(s,sizeof(s),stdin);int num=0;if(s[strlen(s)-1]=='\n'){s[strlen(s)-1]=0;}for(int i=0;i<strlen(s);i++){if(isdigit(s[i])){num=num*10+s[i]-'0';}else{++tok_max;++tok_max;sprintf(tok[tok_max-1],"%d",num);*tok[tok_max]=s[i];num=0;}}++tok_max;sprintf(tok[tok_max],"%d",num);//printf("tok_max..%d\n",tok_max);//for(int i=1;i<=tok_max;i++){//	puts(tok[i]);//}stack<int>optr,opnd;//运算符栈、操作数栈optr.push('#');//检验运算符栈非空的哨兵 for(int i=1;i<=tok_max;i++){if(isdigit(*tok[i])){int num1;sscanf(tok[i],"%d",&num1);opnd.push(num1);}else{for(;optr.top()!='#' && priority(*tok[i]) <= priority(optr.top());){int num2=opnd.top();opnd.pop();int num3=opnd.top();opnd.pop();char op=optr.top();optr.pop();opnd.push(calc(op,num3,num2)%10000);}optr.push(*tok[i]);}}//printf("%d\n",opnd.top());for(;optr.top()!='#';){int num2=opnd.top();opnd.pop();int num3=opnd.top();opnd.pop();char op=optr.top();optr.pop();opnd.push(calc(op,num3,num2)%10000);}printf("%d\n",opnd.top()%10000);return 0;
}

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

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

相关文章

帝国cms数据表删除之后怎么恢复

帝国cms数据表被误删后,可通过备份文件恢复:确认备份文件是否存在停止帝国cms服务导入备份文件设置管理员用户(仅在备份文件包含管理员密码时)启动帝国cms服务检查恢复结果。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTM…

389-基于KU5P的双路100G光纤网络加速计算卡

基于KU5P的双路100G光纤网络加速计算卡 一、板卡概述 基于Xilinx UltraScale+16 nm KU5P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x8智能加速计算卡,该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力,达到最大化地节…

织梦首页如何调用单页文档内容

织梦DedeCMS首页调用单页文档内容的实现方法如下: {dede:sql sql="SELECT body FROM `dede_sgpage` where aid = 3" } [field:body function="htmlspecialchars(cn_substr(@me,100))"/] {/dede:sql} {dede:sql sql="SELECT body FROM `dede_sg…

AXI4传输层概念和跨4K边界理解

1.AXI传输层级概念 在手册的术语表中,与 AXI 传输相关的有三个概念,分别是 transfer(beat)、burst、transaction。用一句话串联就是: 在 AXI 传输事务(Transaction)中,数据以突发传输(Burst)的形式组织。一次突发传输中可以包含一至多个数据(Transfer)。每个 transfe…

织梦DEDECMS怎么用JS方式调用评论总数

document.writeln("共有 <?php require(dirname(__FILE__)."/../include/config_base.php"); $db = new DedeSql(false); $rs = $db->GetOne("SELECT postnum FROM dede_archives WHERE ID={$aid}"); if(!is_array($rs)){ echo "0&q…

帝国CMS中两个关联字段查询结果不一致

1. 检查数据完整性确保关联字段中没有空值或不完整的数据。 确认关联表的字段类型和长度是否一致。 检查关联表的唯一标识符字段是否具有唯一值。2. 修复数据不一致手动更新关联字段中的空值或不完整数据。 使用SQL查询语句更新或删除有问题的记录。 考虑使用数据清理工具修复数…

Windows环境下Redis6.0安装手册

一、下载安装包 访问官网下载压缩包https://download.redis.io/releases/解压缩到指定文件夹二、修改配置文件 打开redis.conf文件,修改daemonize的值为yes三、编译redis源码 Redis通常以源代码的形式分发,‌需要用户自行编译,或直接下载编译好的文件三、启动redis 双击redi…

735-基于3U VPX的AGX Xavier GPU计算主板

基于3U VPX的 Jetson AGX Xavier GPU计算主板是LINUX环境下软件开发等理想工具。拥有VPX标准连接器和特性的接口。是用于视频处理,相机信号,支持PCIE、USB、RS422、RS232、网口、SPI、I2C等综合性的信号计算主板。基于3U VPX的AGX Xavier GPU计算主板 一、板卡概述基于3U VPX…

uniapp 在微信H5、安卓、IOS预览PDF

前言 uniapp在微信内通过链接预览PDF,而现有uniapp插件都是通过在线网站解析例如:mumu-previewOffce但解析网站目前已经不能访问 准备工作 下载PDF.JS https://github.com/mozilla/pdf.js/releases/download/v2.4.456/pdfjs-2.4.456-dist.zip 放置在uniapp根目录static下并自…

Halcon环境变量配置

由于Halcon默认路径是在C盘,但是C盘资源很吃紧。因此把Halcon安装在了D盘,但是默认的环境变量导致某些功能不可用,例如读取默认路径的图片。 一、找到环境变量配置 我的电脑 >> 属性 >> 系统 >> 高级系统设置 >> 高级 >> 环境变量 二、修改环…

零基础学习人工智能—Python—Pytorch学习(一)

前言 其实学习人工智能不难,就跟学习软件开发一样,只是会的人相对少,而一些会的人写文章,做视频又不好好讲。 比如,上来就跟你说要学习张量,或者告诉你张量是向量的多维度等等模式的讲解;目的都是让别人知道他会这个技术,但又不想让你学。 对于学习,多年的学习经验,和…

终极自托管解决方案指南

探索自托管解决方案的终极指南。比较自托管与云服务,了解自托管的优势、挑战及选择方法。深入解析 NocoBase、Matomo、Nextcloud、Bitwarden 和 Ghost 等自托管产品,助你掌控数据和基础设施。本文深入探讨了自托管解决方案的优势及其在当前技术环境中的重要性。我们将:对比云…