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 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...
随机推荐
- 安装Windows和Ubuntu双系统2
安装Windows和Ubuntu双系统 0.552016.12.10 15:54:41字数 2101阅读 6644 这几天开始动手做毕设啦,打算好好过把Linux瘾,接下来便是这两天我在联想电脑上安装 ...
- [Attention Is All You Need]论文笔记
主流的序列到序列模型都是基于含有encoder和decoder的复杂的循环或者卷积网络.而性能最好的模型在encoder和decoder之间加了attentnion机制.本文提出一种新的网络结构,摒弃 ...
- MySQL基础操作(二)
MySQL基础操作 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.注意:使用视图时 ...
- scrapy框架3——请求传参
当使用scrapy爬取的数据不在同一张页面中(一次请求与数据后解析无法获得想要的全部数据),需要请求传参,在第一次解析时实例化item,将item传递,再次将请求到的数据解析后,封装在item中. 关 ...
- Scala 算法案例
移除第一个负数之后的所有负数 // 构建数组 val a = ArrayBuffer[Int]() a += (1, 2, 3, 4, 5, -1, -3, -5, -9) // 每发现一个第一个负数 ...
- Scala 数组操作之数组转换
使用yield和函数式编程转换数组 // 对Array进行转换,获取的还是Array val a = Array(1, 2, 3, 4, 5) val a2 = for (ele <- a) y ...
- Springboot对JPA的支持及使用
目的: 1.springboot之jpa支持 2.Springboot+bootstrap界面版之增删改查及图片上传 springboot之jpa支持 导入相关pom依赖 <dependency ...
- .Net DLL类库引用时没有注释信息
自己编写的类库提供给别人引用时,别人获取不到DLL内部的方法.变量的注释信息,无法了解内部情况和使用方法. 原因:没有随DLL类库一同输出注释文档 解决方案: 在VS界面中选中提供给别人的类库项目 在 ...
- .NET Standards
.net的创始者们在一开始的时候,就意识到了他们的编程技术可以用在不通的操作系统和不同类型的cpu上.他们改进了20世纪90年代编程语言实现技术.最主要的一条是,不同的编程语言对应统一个运行时,及CL ...
- 线程三(Mutex)
C# 中 Mutex 类也是用于线程同步操作的类,例如,当多个线程同时访问一个资源时保证一次只能有一个线程访问资源. 在 Mutex 类中,WaitOne() 方法用于等待资源被释放, Release ...