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 ...
随机推荐
- pandas-05 map和replace操作
# pandas-05 map和replace操作 map可以做一个映射,对于操作大型的dataframe来说就非常方便了,而且也不容易出错.replace的作用是替换,这个很好理解. import ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约
账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...
- python SqlServer操作
python连接微软的sql server数据库用的第三方模块叫做pymssql(document:http://www.pymssql.org/en/stable/index.html).在官方文档 ...
- 0x01 Python logging模块
目录 Python logging 模块 前言 logging模块提供的特性 logging模块的设计过程 logger的继承 logger在逻辑上的继承结构 logging.basicConfig( ...
- H3C WLAN相关组织和标准
- 【Spring Boot】Spring Boot之自定义配置参数绑定到Java Bean
一.@Value方式 1.我的配置文件:application-dev.yml # 自定义项目配置 startproject: pro1: pro2: pro3: pro4: lists: - ' - ...
- USB之hub3
============= 本系列参考 ============= <圈圈教你玩USB>.<Linux那些事儿之我是USB> 协议文档:https://www.usb.or ...
- 编译heartbeat出现的问题
如报 cc1: warnings being treated as errors pils.c:245: error: initialization fromincompatible pointer ...
- 微信小程序~用户转发 onShareAppMessage
只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮,在用户点击转发按钮的时候会调用,此事件需要return一个Object,包含title和path两个字段,用于自定义转发内容 代码使用onSh ...
- WinForm利用AForge.NET调用电脑摄像头进行拍照和视频
当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...