题目地址

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. Assignment 2: UDP Pinger[课后作业]

    Computer Networking : A Top-Down Approach 的课后作业. 要求: 基于UDP协议,实现一个Pinger工具. 服务端代码已经提供了,自己实现客户端的代码. 完整 ...

  2. 原生JavaScript遮罩

    /* 适用原生JS */ function showInfo(info) {     var zzInfo = info;     var mask_bg = document.createEleme ...

  3. Commander基本使用

    随着NodeJs的不断发展,对于前端来说要做的东西也就更多,Vue脚手架React脚手架等等等一系列的东西都脱颖而出,进入到人们的视野当中,对于这些脚手架工具来讲也只是停留在应用阶段,从来没有想过脚手 ...

  4. element-ui select多选情况下获取label和value

    直接上代码 <el-select v-model="value" multiple collapse-tags ref="select" @change= ...

  5. Js 打印 div

    var wind = window.open("", 'newwindow', 'height=700, width=1000, top=100, left=100, toolba ...

  6. 乌班图安装Lnmp环境

    1.nginx //切到root用户 sudo su //更新源 apt-get update //安装 apt-get install nginx //安装完成后配置文件目录 cd /etc/ngi ...

  7. A quick introduction to Google test

    视频参考:Google C++ Testing GTest GMock Framework 为什么要使用 Google C++ Testing Framework? 使用这个框架有许多好理由.本文讨论 ...

  8. ARTS-week1

    Algorithm 小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜.他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的 ...

  9. 文件上传相关报错: The current request is not a multipart request或is a MultipartResolver configured?

    1:from中涉及到图片上传的就要用post提交方式.否则就会报这个错误. 2:第一中:在jsp页面的<head></head>标签里面加上<meta http-equi ...

  10. Kafaka 总结

    Kafka是一个分布式的Streaming处理平台,Kafka可以用于数据库中数据的导入导出,也可以用于实时流的处理,但是Kafka最核心的功能就是作为分布式的消息中间件. Kafka集群是由多个Br ...