NYOJ128前缀式计算
前缀式计算
- 描述
-
先说明一下什么是中缀式:
如2+(3+4)*5这种我们最常见的式子就是中缀式。
而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))
然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )
把括号去掉就是:+ 2 * + 3 4 5
最后这个式子就是该表达式的前缀表示。
给你一个前缀表达式,请你计算出该前缀式的值。
比如:
+ 2 * + 3 4 5的值就是 37
- 输入
- 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。 - 输出
- 对每组数据,输出该前缀表达式的值。输出结果保留两位小数。
- 样例输入
-
+ 2 * + 3 4 5
+ 5.1 / 3 7 - 样例输出
- 37.00
- 5.53
这个题目也是用栈来做的,只不过顺序与后缀式有点不同,他与中缀的区别是可以不用比较优先级,
因为前缀和后缀式中都没有括号,直接按照顺序计算就行了,下面是具体的实现代码,代码中有注释,
如有不懂的,可以留言…
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct stack{
double data;
struct stack *next;
}stack;
stack *init();
int isOperand(char ch);
stack *push_stack(stack *top, double data);
stack *pop_stack(stack *top);
void calc(stack **top, char ch);
int main()
{
char ch[], temp[];
stack *top;
top = init();
double num; int i, count, flag, j;
while(gets(ch) != NULL)
{
i = strlen(ch) - ;
while(i >= )
{
if(ch[i] == ' ')//判断如果是空格,继续下一个
{
i --;
continue;
}
if(isOperand(ch[i]))//如果是运算符,这是调用计算函数
{
calc(&top, ch[i]);
i --;
continue;
}
count = ; flag = ; j = ;
while(!isOperand(ch[i]) && ch[i] != ' ' && i >= )//判断是数字的话就保存到一个新的数组中
{
temp[j++] = ch[i];
i --;
}
j = j -;
num = ;
while(j >= )//将字符串解析成double类型数字
{ if(temp[j] == '.')
{
flag = ;
j --;
continue;
}
if(flag)
num = num * + (temp[j] - '');//如果没出现小数点之前,都是*10 + 本身的
else
{
count ++;
num += pow(0.1, count) * (temp[j] - '');//出现小数点之后就得加上0.1的count此方了
}
j --;
}
top = push_stack(top, num);
}
printf("%.2f\n", top -> data);
}
return ;
}
stack *init()//初始化栈
{
stack * node;
node = (stack *)malloc(sizeof(stack));
node -> next = NULL;
return node;
}
int isOperand(char ch)//判断是不是运算符
{
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
return ;
return ;
}
stack *push_stack(stack *top, double data)//入栈
{
stack *node;
node = init();
node -> data = data;
node -> next = top;
top = node;
return top;
}
stack *pop_stack(stack *top)//出栈
{
stack *node;
node = top;
top = top -> next;
free(node);
return top;
}
void calc(stack **top, char ch)//计算函数,当然也可以不用二级指针,把void改成stack返回类型 就行了
{
double num1, num2;
num1 = (*top) -> data;
(*top) = pop_stack(*top);
num2 = (*top) -> data;
(*top) = pop_stack(*top);
switch(ch)
{
case '+':
num1 = num1 + num2;
break;
case '-':
num1 = num1 - num2;
break;
case '*':
num1 = num1 * num2;
break;
case '/':
num1 = num1 / num2;
break;
}
(*top) = push_stack(*top, num1);//计算完之后将结果继续入栈
}
NYOJ128前缀式计算的更多相关文章
- NYOJ128 前缀式计算 【栈】
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...
- NYOJ128 前缀式计算(栈的运用)
题目信息: http://acm.nyist.net/JudgeOnline/problem.php? pid=128 + 2 * + 3 4 5的值就是 37,详见输入输出. 输入 有多组測试数据, ...
- NYOJ 128 前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- 前缀式计算 nyoj
题目描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 ...
- NYOJ--128--前缀式计算(表达式求值)
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- nyoj-----前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀 ...
- 搜索广告与广告网络Demand技术-流式计算平台
流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...
- 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15
上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...
- Apache Beam—透视Google统一流式计算的野心
Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...
随机推荐
- C++实现base64编码(1)
下面的代码是php里面的base64编码逻辑,确实比我之前的要美观很多,我只是简单的用C++的类进行了一下封装,删除了一些没用的逻辑,基本上还是原来PHP的代码: #include <iostr ...
- lsmod
http://blog.csdn.net/yuan892173701/article/details/8960607 抽空写下
- Zephyr-MQTT
Zephyr OS 支持MQTT协议,其源码目录在: # cd /zephyr-/samples/net/paho_mqtt_clients/publisher/ # cd /zephyr-1.5.0 ...
- 转:gpio_direction_output 与 gpio_set_value
gpio_set_value(port_num,0/1) 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了! 而gpio_direction_output (por ...
- 关于判断变量是否为null的顺序问题。
if("y".equals(other)){ } 其中,other字符串变量可能为Null,可以加一个null判断或者将常量写在前面,变量写在equals后面.如果将变量other ...
- AV 地址错误 map 文件 根据地址报错,查 Delphi 代码
1. 首先需要设置程序生成 map 文件.Project -> Options -> Linker -> Map file , Detailed 2. 计算公式Edit2.Text ...
- oralce 仅配置精简客户端 连接plsql ( 版本需一直,要不都是32要不是都是64)
1.Oracle服务器已经安装完成,版本10.2.0. 2.访问www.oracle.com,下载Oracle精简客户端. 下载页面地址:http://www.oracle.com/technetwo ...
- 用 SQL 脚本读取Excel 中的sheet数量及名称
-- Get table (worksheet) or column (field) listings from an excel spreadsheet -- 设置变量 declare @linke ...
- Linux Shell编程(5)——shell特殊字符(下)
{}代码块[花括号]. 这个结构也是一组命令代码块,事实上,它是匿名的函数.然而与一个函数所不同的,在代码块里的变量仍然能被脚本后面的代码访问. bash$ { local a; a=123 ...
- 老罗android开发视频教程学习完了
让我学到了android的文件结构,事件窗口数据传递,百度地图开发很感谢