hdu1237 简单计算器[STL 栈]
题目地址
题干

代码和解释
解本题时使用了STL 栈,要记得使用#include<stack>。
解本题时使用了isdigit()函数,要使用#include<ctype.h>
逆波兰表达式:
1.又叫后缀表达式。我们平时使用的叫做中缀表达式,可以由下图对比理解。

2.栈的操作:
如果当前字符为变量或者为数字,则压栈,
如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈
最后当扫描完后,栈里的就是结果。
本题方法——算符优先法:
栈的操作:
从左向右扫描,遇到操作数压入操作数栈。
遇到运算符,先与运算符栈顶运算符比较优先级,(我的代码里使用pri函数定义优先级)
若栈顶运算符的优先级高(或相等),则栈顶运算符出栈并执行运算。
否则将当前运算符入栈,直至整个表达式求值完毕。
这里是c++代码。
#include<iostream>
#include<string.h>
#include<stack>
#include<ctype.h>
using namespace std;
int pri(char c);
char str[250];
double cal();
int main()
{
while(gets(str)!=NULL && strcmp(str,"0")!=0){
printf("%.2lf\n",cal());
}
return 0;
}
int pri(char c){
if(c=='*'||c=='/'){
return 2;
}
else if(c=='+'||c=='-'){
return 1;
}
else return 0;//这里处理了'/0'的情况
}
double cal(){
double tmp;
int i;
double t1,t2,t3;
stack<double> num;//存操作数,因为最终结果为浮点数,所以设为double
stack<char> opr;//存运算符
opr.push('\0');//一开始缺少这一行,导致无法运行。因为下面需要比较opr栈顶的优先级。
for(i=0;i<=strlen(str);i++){//小于等于是为了算上最后的'\0'
if(str[i]==' '){
continue;
}
if(isdigit(str[i])){//如果是数字
//printf("hello digit\n");
sscanf(str+i,"%lf",&tmp);//sscanf可以从字符串中读取格式化输入
num.push(tmp);//入栈
while(isdigit(str[i])){
i++;//跳过这个整数
}
i--;//多加了一次,减去它
}
else{//除了读入运算符,这里还包括最后一位'\0'
//printf("hello other\n");
while(pri(str[i])<=pri(opr.top())){
t1=num.top();
num.pop();
t2=num.top();
num.pop();
if(opr.top()=='+'){
t3=t2+t1;
opr.pop();
}
else if(opr.top()=='-'){
t3=t2-t1;//注意t2和t1的顺序
opr.pop();
}
else if(opr.top()=='*'){
//printf("乘法\n");
t3=t2*t1;
//printf("t2=%.2lf,t1=%.2lf,t3=%.2lf\n",t2,t1,t3);
opr.pop();
}
else if(opr.top()=='/'){
t3=t2/t1;//注意t2和t1的顺序
opr.pop();
}
num.push(t3);//运算结果入栈
if(str[i]=='\0'&&opr.top()=='\0'){//字符串读完了,并且运算符也都使用完了,结束 (缺一不可)
//printf("%c",opr.top());
return num.top();//返回计算的最终结果
}
}
opr.push(str[i]);
}
}
}
本题要注意输入数据的方法:
while(gets(str)!=NULL && strcmp(str,"0")!=0)
解本题时出现了很多微观的问题,在代码的注释中也有提及,一点点地改进,最终提交oj一次ac很爽( ̄▽ ̄)
参考
| 例子 | 说明 |
|---|---|
| stack<Type> s; | 定义栈,Type为数据类型,如int,float,char等。 |
| s.push(item); | 把item放到栈顶 |
| s.top(); | 返回栈顶的元素,但不会删除 |
| s.pop(); | 删除栈顶的元素,但不会返回 |
| s.size(); | 返回栈中元素的个数 |
| s.empty(); | 检查栈是否为空,如果为空返回true,否则返回false |
hdu1237 简单计算器[STL 栈]的更多相关文章
- HDU1237 简单计算器 【栈】+【逆波兰式】
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu 1237 简单计算器(栈处理)
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU1237 简单计算器 2016-07-24 13:34 193人阅读 评论(0) 收藏
简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过 ...
- HDU 1237 简单计算器(栈+stringstream)
提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...
- HDU1237 简单计算器 栈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...
- hdu-1237简单计算器(栈的运用)
http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...
- hdu-1237 简单计算器---中缀表达式转后缀表达式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...
- hiho #1332 : 简单计算器 栈+递归
#1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...
- F - 简单计算器(栈)
F - 简单计算器 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descripti ...
随机推荐
- python中configparser模块读取ini文件
python中configparser模块读取ini文件 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(se ...
- spring 中的 bean 是线程安全的吗?
spring 中的 bean 是线程安全的吗? Spring 不保证 bean 的线程安全. 默认 spring 容器中的 bean 是单例的.当单例中存在竞态条件,即有线程安全问题.如下面的例子 计 ...
- idea安装与注册码破解
idea安装与注册码破解 https://www.cnblogs.com/jajian/p/7989032.html
- mybatis批量更新报错 org.mybatis.spring.MyBatisSystemException
具体报错信息: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bin ...
- Kubernetes集群开启Firewall
关于端口的官方说明:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ k8s ...
- oracle instantclient_12_2安装
下载地址 http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index ...
- golang中逗号ok模式_转
,ok,第一个参数是一个值或者nil,第二个参数是true/false或者一个错误error.在一个需要赋值的if条件语句中,使用这种模式去检测第二个参数值会让代码显得优雅简洁.这种模式在go语言编码 ...
- Python的高级文件操作(shutil模块)
Python的高级文件操作(shutil模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让我们用python的文件处理来进行文件拷贝,想必很多小伙伴的思路是:使用打开2个 ...
- 微信小程序~跳页传参
[1]需求: 点击商品,跳到相应商品详情页面 [2]代码: (1)商品列表页 <view class="goodsList"> <view wx:for=&quo ...
- assert 断言
输入 assert 1>2,'123' 输出结果 assert 1>2,'123' AssertionError: 123