HDU-1237- 简单计算器--栈的基本应用
简单计算器
简单分析:
栈的基本应用,模拟计算机的底层计算功能。非负整数表示0也可出现在表达式中,小数点后两位表示需要用double类型来存储数据。
这类问题转化为后缀表达式来做,更常规正式点,编写速度更快;不过,我还是用基本两个栈的模拟,先大致理清几类思路,然后尝试编程,才测试各种自造地合理的尽可能全面的样例:哪里有bug就去补哪里。(如果思路没有理清,比较费时间吧!简单题貌似还好说!)
代码里的注释给的比较详细,自己点开看看。给出下面几组参考数组,只要可以正确基本可以AC:
1 + 2
1 + 2 * 3 - 4 / 5
1111+220/220*1+1*1*0
2*2*2/8-4+5/5/5*5
16*8/4+7-3/3*9
0-8+9
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
#define N 60010
stack<double>num; double arr1[]; //存储数字的栈,arr1[]存贮分离出来的数字
stack<char>op;double arr2[]; //存贮运算符的栈 ,arr2存贮分离出来的运算符 int pos1,pos2; //pos1和POS2分别表示arr1和arr2的长度
char str[]; //输入数据时的原字符串 void fact1() //將字符串中的數字和运算符提取出来存放进数组里
{
int i=;
int len=strlen(str);
pos1=pos2=;
while(i<len)
{
while(i<len&&str[i]==' ')i++; //处理空格
if(i==len)break;
if(str[i]>=''&&str[i]<='') //分离数字(比如1234,1后面肯定是数字,4后面不是数字)
{
double sum=0.0;
for(; i<len&&str[i]>=''&&str[i]<=''; i++)
sum=sum*10.0+str[i]-'';
arr1[pos1++] = 1.0*sum;
}
else //分离字符
{
arr2[pos2++]=str[i++];
}
}
}
void solve()
{
fact1(); //处理字符串
char nowop;
int p1=; //指向arr1的要使用时的数字下标,初始时为0表示最早从arr1【0】开始
int p2=; //指向arr2的要使用时的字符的下标,
num.push(arr1[p1++]);
op.push(arr2[p2++]);
while(p1<pos1||p2<pos2||num.size()>=) //判断循环条件
{
while(num.size()<&&p1<pos1) //维持数字栈中保留两个
num.push(arr1[p1++]);
if(p2<pos2&&op.empty()) //维持运算符栈中保留1个运算符
op.push(arr2[p2++]); if(op.top()=='*'||op.top()=='/') //直接可以进行运算,如3*7/8+4 时,3*7可直接算
{
double n1,n2;
n1=num.top();num.pop();
n2=num.top();num.pop();
nowop=op.top();op.pop();
if(nowop=='*')
num.push(n2*n1);
else
num.push(n2/n1);
}
//栈外的运算符级别高,例如3+5*8时,‘’*‘’级别大于‘’+‘’
else if(p2<pos2&&(nowop=arr2[p2])&&(nowop=='*'||nowop=='/')&&(op.top()=='+'||op.top()=='-'))
{
double s1;
if(nowop=='*')
s1=num.top()*arr1[p1++];
else
s1=num.top()/arr1[p1++];
num.pop();
num.push(s1);
p2++; //运算符数组指向下一位
}
else //栈外的运算符等级与栈内相等,或者无运算符,例如5+9-6,’-‘号相对’+‘平级
{
double n1,n2;
n1=num.top();num.pop();
n2=num.top();num.pop();
nowop=op.top();op.pop();
if(nowop=='-')
num.push(n2-n1);
else
num.push(n1+n2);
}
}
printf("%.2lf\n",num.top());
}
int main()
{
while(gets(str),str[]!=''||strlen(str)!=)
//谨防样例:0+0(也就说以0开头的式子也合法,这时需要再判一下长度!)
{
while(!num.empty())
num.pop();
while(!op.empty())
op.pop();
solve();
}
return ;
}
HDU-1237- 简单计算器--栈的基本应用的更多相关文章
- HDU 1237 简单计算器 栈
额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...
- hdu 1237 简单计算器
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...
- hdu 1237 简单计算器(栈处理)
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU 1237 简单计算器(栈+stringstream)
提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...
- hdu 1237 简单计算器 (表达式求值)【stack】
<题目链接> 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符, ...
- hdu-1237简单计算器(栈的运用)
http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...
- hiho #1332 : 简单计算器 栈+递归
#1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...
- hdoj 1237 简单计算器
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- F - 简单计算器(栈)
F - 简单计算器 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descripti ...
- HDU1237 简单计算器 栈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...
随机推荐
- 微信小程序之 语言特点
主页面的CSS样式默认为index.wxss,无需引入
- mousedown、mouseup、click事件之间的关系及执行顺序
三个事件的触发时机 mousedown 当鼠标指针移动到元素上方,并按下鼠标按键(左.右键均可)时,会发生 mousedown 事件.与 click 事件不同,mousedown 事件仅需要按键被 ...
- redhat与zlib兼容性问题?
今天在redhat 6.3 x64版本上安装了zlib,安装完后可以正常使用,就是发现gedit使用有点异常——无法启动,当时也没在意,但是后来重启电脑后出现桌面背景图片后就不弹出登陆窗口了,但是进命 ...
- git实现码云的上传和下载
上传步骤: 1.码云上新建一个项目 XXXX? ?(项目名) 2.本地创建一个文件夹E:/XXXX,然后使用git bash? ?? 3.cd 到本地文件夹中E:/XXXX? //如果是在创建的文件中 ...
- MappingJackson2JsonView——model转成json
一.ajax请求,返回ModelAndView对象,结果报404: @RequestMapping(value = "/video") public ModelAndView jj ...
- 【Docker】:全面认识Docker和基本指令
Docker逐渐成为虚拟化技术的佼佼者,接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引擎,基于Go语言, ...
- python学习-59 hashlib模块
hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块 加密功能 import hashlib obj = hashlib.md5() # 如果在md5里加上自己设置的参数,别的 ...
- Python--类的定义与使用
转载自https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200407 ...
- idea的项目结构
idea项目结构: 一般是创建一个empty project,然后再创建一个个的Module.
- Docker从入门到掉坑(五):继续挖一挖 k8s
在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习 pod是啥 在k8s里面,有很多新的技术概念,其 ...