表达式求值(sscanf用法)(stack练习)(第四届河南省大学生程序设计竞赛)
题目描述
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
一个正的十进制数 x 是一个表达式。
如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
输入
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
输出有N行,每一行对应一个表达式的值。
样例输入
3
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
样例输出
3
999
200
sscanf解法
首先要先储备一些知识,下面是我在其他博主哪里学到的我认为对本题有用的一些sscanf的用法
#include<bits/stdc++.h>
using namespace std;
//sscanf的使用 int main()
{char buf[512];int t,p;sscanf("12 3456","%d%n",&t,&p);//%n意为scanf收到的有效字符数,所以此时的p应为2 printf("%d %d\n",t,p); //12 2//%[a-z]表示比配a到z中任意字符sscanf("123aflhaldkjfEFFLJD","%[1-9a-z]",buf);printf("%s\n",buf); //123aflhaldkjf//%[^a-z]表示取到a到z中任意字符就停止sscanf("1234578aldksLKJF","%[^A-Z]",buf);printf("%s\n",buf); //1234578aldks//%*[]和%*d,%*c同样,即跳过该范围sscanf("asdf/1324akldfj;11","%*[asdf]%[^ ]",buf);//即跳过了[asdf],取到了 1324akldfj;11printf("%s\n",buf); ///1324akldfj;11sscanf("asdf/1324akldfj;11","%*[^/]%[^;]",buf);printf("%s\n",buf); // /1324akldfjreturn 0;
}
下面是用递归解决的代码,了解了sscanf的一些用法是不难看懂下面的代码的
#include<bits/stdc++.h>
using namespace std;
//sscanf的使用
int start=0;
char str[1000];
int fun()
{int v,n;switch(str[start]){case 'm':{start=start+4;if(str[start-2]=='n'){return min(fun(),fun());}else{return max(fun(),fun());}}case 'a':{start=start+4;return fun()+fun();}case '(':case ')':case ',':{start=start+1;return fun();}default:{sscanf(str+start,"%d%n",&v,&n);start=start+n;return v; }}
}
int main()
{int t;cin>>t;getchar();while(t--){cin>>str;start=0; cout<<fun()<<endl;}return 0;
}
stack解法
stack 满足 先入后出没有迭代器 不可随机访问stack<int> x ; int t ;1. x.push(t) ; //向栈顶插入t 注意: 尾部叫做栈顶2. x.pop(t) ; //删除栈顶元素3. size() 4. empty() 5. 与vector类似 但没有clear() 操作
用stack实现将中缀表达式转换为后缀表达式和此题是相似的
首先要建立两个stack,先找运算符,再找操作数。
== 运算符要注意优先级运算,先运算的优先级大。 ==
思想
== 将中缀表达式变为后缀表达式 ==
如果这一个运算符比上一个的优先级高,就需要把上一个的运算符pop了之后再比较top直到大于将此运算符压栈
注意()运算级最高,如果遇到 ‘(’ 则压栈,如果遇到 ‘)’ 则需要把栈里面的运算符依次出栈参与运算,直到遇到 ‘)’ .
详细思想见
解题代码
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
//stack
char ch[1010];
int fun(char ch,int x,int y)
{if(ch=='+')return x+y;else if(ch=='>')return max(x,y);else if(ch=='<')return min(x,y);
}
int main()
{stack<char>str;stack<int>num;int n;cin>>n;while(n--){cin>>ch;for(int i=0; i<strlen(ch); i++){if(ch[i]=='a'){str.push('+');i=i+3;}else if(ch[i]=='m'){if(ch[i+1]=='a'){str.push('>');i=i+3;}else {str.push('<');i=i+3;}}else if(ch[i]>='0'&&ch[i]<='9'){int n,v;sscanf(ch+i,"%d%n",&v,&n);num.push(v);i=i+n-1;}char a;int b;int c;else if(ch[i]==')'){a=str.top();str.pop();b=num.top();num.pop();c=num.top();num.pop();num.push(fun(a,b,c));}}cout<<num.top()<<endl;}
}
表达式求值(sscanf用法)(stack练习)(第四届河南省大学生程序设计竞赛)相关推荐
- 2013年山东省第四届ACM大学生程序设计竞赛
Rescue The Princess Time Limit: 1000MS Memory limit: 65536K 题目描述 Several days ago, a beast caught ...
- 2013年山东省第四届ACM大学生程序设计竞赛 Problem I Thrall’s Dream 图,2n遍dfs
Thrall's Dream Time Limit: 1000MS Memory limit: 65536K 题目描述 We never paid any heed to the ancient pr ...
- 山东省第四届ACM大学生程序设计竞赛 Thrall’s Dream(单源强连通分量)
Thrall's Dream Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 We never paid any heed to ...
- 【算法题解】2022年第四届河南省CCPC大学生程序设计竞赛(喜提银牌)
文章目录 A. Mocha 上小班啦 E. Serval 的俳句 F. 集合之和 G. Mocha 上大班啦 H. 旋转水管 比赛题目已上传到CF:2022 CCPC Henan Provincial ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- java expression 用法_Spring实战之使用Expression接口进行表达式求值操作示例
本文实例讲述了Spring使用Expression接口进行表达式求值操作.分享给大家供大家参考,具体如下: 一 Bean package org.crazyit.app.domain; import ...
- 每天一道LeetCode-----后缀表达式求值
Evaluate Reverse Polish Notation 原题链接Evaluate Reverse Polish Notation 后缀表达式求值,用栈即可 代码如下 class Soluti ...
- NYOJ 35表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出 ...
- 表达式求值(最详细分析+代码实现+表达式之间的相互转换)
目录 一.概念 二.前缀表达式的逻辑和实现方式 1.定义 2.前缀表达式的计算机求值 3.例子 4.代码实现 三.中缀表达式的逻辑和实现方式 1.定义 2.中缀表达式规则 3.中缀表达式的计算机求值 ...
最新文章
- Numpy and Matplotlib
- 不藏私分享五個線上自學平台
- 什么是真正的高清,你知道吗?
- 【Java】集合框架基础编程练习题
- 查看python安装位置图_python安装路径怎么找
- Elasticsearch 数据搜索篇
- CSS3渐变——gradient
- 浅谈集群、分布式、微服务的异同
- 编写 USB 存储设备使用痕迹检测和删除工具
- [RK3288][Android6.0] 音频输入接口Mic In和Line In
- SetProcessWorkingSetSize 和内存释放
- 大话西游java正版_大话西游手游
- 明日之后 找不到服务器,明日之后登录服务器错误怎么办 登录服务器错误请重试解决方法...
- 数据结构课程设计--实验室设备管理系统(c语言)
- 中粮粮油化工厂人员定位解决方案,解决目前化化工厂普遍问题-新导智能
- 360企业版域环境msi包格式部署
- 03_RabbitMQ快速入门案例
- (三)初识打印机驱动
- 虚拟翻书系统,相比传统有哪些优势
- 《算法》-字符串[数据压缩]