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 ...
随机推荐
- Django:表多对多查询、聚合分组、FQ查询、事务
1表多对多的关系查询 准备工作创建表结构 from django.db import models # Create your models here. class Publisher(models. ...
- Kali 2019(debian linux)安装MySql5.7.x
Kali 2019(debian linux)安装MySql5.7.x MySQL安装 确认是否安装MySQL 终端输入:mysql 如出现Welcome to the MariaDB monitor ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- jetbrains全家桶激活
56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2DIC4iLCJhc3NpZ25lZ ...
- 关于Python学习之 列表与字典
列表 列表是Python中最具灵活性的有序集合对象类型. # 列表迭代和解析 >>> res = [c*4 for c in 'Spam'] >>> res ['S ...
- 基于 K8S 集群安装部署 istio-1.2.4
使用云平台可以为组织提供丰富的好处.然而,不可否认的是,采用云可能会给 DevOps 团队带来压力.开发人员必须使用微服务以满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部署.Istio 允 ...
- xshell 连接出现 The remote SSH server rejected X11 forwarding request
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ yum install xorg-x11-xauth 同时sshd的config文件开启X11Forwarding yes vim ...
- springboot+druid+mybatis
pom.xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId> ...
- MySQL Case--Strict mode与NOT NULL
事故回溯 某业务流程操作为: 1.循环扫描某张待处理请求表,查看是否有请求等待处理. 2.找到待处理请求后,申请相关资源进行处理,并将处理结果插入到处理结果表中. 3.将该请求从待处理请求表中移除. ...
- Vi 和 Vim 编辑器详细使用方法
学习linux的一项必会技能,熟练使用vi/vim编辑器那便最重要的了.不过一堆操作看的也是太头疼了,以下整理了些常用到的命令. 工作模式 vi编辑界面有三种不同的工作模式,分别为命令模式.输入模式. ...