题目地址

hdu1237

题干

代码和解释

解本题时使用了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很爽( ̄▽ ̄)

参考

HDU1237简单计算器-中缀表达式-后缀表达式

例子 说明
stack<Type> s; 定义栈,Type为数据类型,如int,float,char等。
s.push(item); 把item放到栈顶
s.top(); 返回栈顶的元素,但不会删除
s.pop(); 删除栈顶的元素,但不会返回
s.size(); 返回栈中元素的个数
s.empty(); 检查栈是否为空,如果为空返回true,否则返回false

hdu1237 简单计算器[STL 栈]的更多相关文章

  1. HDU1237 简单计算器 【栈】+【逆波兰式】

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. hdu 1237 简单计算器(栈处理)

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. HDU1237 简单计算器 2016-07-24 13:34 193人阅读 评论(0) 收藏

    简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过 ...

  4. HDU 1237 简单计算器(栈+stringstream)

    提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...

  5. HDU1237 简单计算器 栈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...

  6. hdu-1237简单计算器(栈的运用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...

  7. hdu-1237 简单计算器---中缀表达式转后缀表达式

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...

  8. hiho #1332 : 简单计算器 栈+递归

    #1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...

  9. F - 简单计算器(栈)

    F - 简单计算器 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descripti ...

随机推荐

  1. nodeJS微信JSDK 配置

    nodeJS微信JSDK 配置 一.微信公众平台申请一个测试公众号 二.配置nodeJS 使用express框架搭建服务器 微信生成签名步骤: 1.获取token 2.通过token,获取jsapi_ ...

  2. printf打印字节

    int i = 0; printf("buf:"); for(i = 0; i < sizeof(buf); i++) { printf("0x%x", ...

  3. JENKINS安卓打包CI

    jenkins构建脚本: [root@localhost tomcat]# cat move.sh #!/bin/bash # author lql release_dir=/data/android ...

  4. ningx配置本地https环境

    由于项目改成了https访问,所以本地开发的时候也要通过https验证,避免页面发送http请求. 例如原来是这样访问:http://192.168.88.88:8080/ 或 http://loca ...

  5. java requestmapping中关于路径的问题

    需要这种url写的方式才能映射

  6. Centos7搭建Harbor私有仓库(一)

    1 说明 前文Centos7搭建DockerRegistry介绍了DockerRegistry的搭建,但它没有UI页面,因此选择Harbor 以下基于镜像CentOS-7-x86_64-Minimal ...

  7. 03-JavaScript语法介绍

    本篇主要关于原生JavaScript的介绍,其中包括其嵌入HTML页面方式,JavaScript的语法结构,以及贪吃蛇案例: 一.绪论 JavaScript是运行在浏览器端的脚步语言,JavaScri ...

  8. xshell连接linux使用vim无法正常使用小键盘

    解决方法 文件-->属性-->终端-->终端类型-->linux 之后重新连接即可

  9. Pods

    Pods Pod概念 Pod是kubernetes集群应用中的创建和部署的最小.最简单的kubernetes对象模型单元的基本执行单元.Pod表示在集群中运行的进程. Pod 封装了应用程序的容器(一 ...

  10. Pthon魔术方法(Magic Methods)-hash

    Pthon魔术方法(Magic Methods)-hash 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hash方法 __hash__: 内建函数hash()调用的返回值,返 ...