郁闷的C小加(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述

聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。

 
输入
第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。
输出
对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。
样例输入
2
1+2=
(19+21)*3-4/5=
样例输出
12+=
3.00 1921+3*45/-=
119.20
来源
改编自NYOJ
 
 #include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
#include <cctype> using namespace std; char str[];
stack<char> Optr;
stack<float> Opnd; char judge(char c1, char c2)
{
if(c1 == '+' || c1 == '-')
{
if(c2 == '*' || c2 == '/' || c2 == '(')
return '<';
else
return '>';
}
if(c1 == '*' || c1 == '/')
{
if(c2 == '(')
return '<';
return '>';
}
if(c1 == '(' && c2 == ')' || c1 == '=' && c2 == '=')
return '=';
return '<';
} float cal(float num1, float num2, char p)
{
if(p == '+')
return num1 + num2;
else if(p == '-')
return num1 - num2;
else if(p == '*')
return num1 * num2;
else if(p == '/')
return num1 / num2;
} void change()
{
int len = strlen(str);
while(!Opnd.empty())
Opnd.pop();
while(!Optr.empty())
Optr.pop();
Optr.push('='); for(int i = ; i < len;)
{
if(isdigit(str[i]) || str[i] == '.')
{
float t1 = ;
int t2 = ;
bool flag = false;
while(isdigit(str[i]) || str[i] == '.')
{
if(flag)
t2 *= ;
if(isdigit(str[i]))
t1 = t1*+str[i]-'';
else
flag = true;
printf("%c", str[i]);
++i;
}
Opnd.push(t1/t2);
}
else
{
char tmp = judge(Optr.top(), str[i]);
if(tmp == '<')
{
Optr.push(str[i]);
++i;
}
else if(tmp == '>')
{
tmp = Optr.top();
printf("%c", tmp);
Optr.pop();
float num1 = Opnd.top();
Opnd.pop();
float num2 = Opnd.top();
Opnd.pop();
Opnd.push(cal(num2, num1, tmp));
//++i;
}
else
{
Optr.pop();
++i;
}
}
}
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", str);
change();
printf("=\n%.2f\n", Opnd.top());
if(T)
printf("\n");
}
return ;
}

NYOJ-267 郁闷的C小加(二)的更多相关文章

  1. NYOJ 267 郁闷的C小加(二) (字符串处理)

    题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...

  2. NYOJ 409 郁闷的C小加(三) (字符串处理)

    题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...

  3. nyoj 409——郁闷的C小加(三)——————【中缀式化前缀后缀并求值】

    郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很 ...

  4. NYOJ 257 郁闷的C小加(一)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说) ...

  5. nyoj 257 郁闷的C小加(一)(栈、队列)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  6. NYOJ 257 郁闷的C小加(一) (字符串处理)

    题目链接 描述 我们熟悉的表达式如a+b.a+b(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符 ...

  7. nyoj-257 郁闷的C小加(一) 前缀表达式变后缀

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. 郁闷的C小加(一)(后缀表达式)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  9. nyoj 236 心急的C小加

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的 ...

随机推荐

  1. “通用类型系统”(CTS)

    一.什么是“通用类型系统”(CTS) 描述类型的定义和行为 二.CTS规范 一个类型可以包含零个或者多个成员1,成员①字段(Field)作为对象状态一部分的数据变量.字段根据名称和类型来区分②方法(M ...

  2. Python 序列与映射的解包操作

    解包就是把序列或映射中每个元素单独提取出来,序列解包的一种简单用法就是把首个或前几个元素与后面几个元素分别提取出来,例如: first, seconde, *rest = sequence 如果seq ...

  3. [ 原创 ]Centos 7.0下启动 Tomcat8.5.15

    1.打开8080端口  firewall-cmd --zone=public --add-port=8080/tcp --permanent 2.重启防火墙   firewall-cmd --relo ...

  4. [Agc002E]Candy Piles

    [Agc002E]Candy Piles 题目大意 有\(n\)个数,两人轮流操作,可以做以下操作之一: 删掉一个最大的数 将所有数-1 最后取没的人输,问先手是否必胜? 试题分析 直接决策不知道选哪 ...

  5. Linux重新学习

    一.由来 unix到minix到linux 1991正式发行 1.内核版本:linux核心版本 linux内核官网www.kernel.org 2.发行版本:比如redhat.centOS.suse. ...

  6. UploadFileUtil

    package cn.tz.util.file; import java.io.File; import java.io.FileOutputStream; import java.io.InputS ...

  7. 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现

    算法描述 克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...

  8. angularjs-ui插件ui-select和html的select注意事项及区别

    项目中使用了angular-ui里的ui-select指令,地址https://github.com/angular-ui/ui-select 1. ng-model没有双向数据绑定 最开始没有看手册 ...

  9. Towelroot v3.0版发布 将支持更多设备 Towelroot v3.0下载

    Towelroot虽然已经发布一段时间了,虽然所Towelroot可以一键ROOT很多设备,虽然它只有100多K.不过还是有一小部分的机型没办法ROOT成功的,也不知道什么原因.不过不用担心,Geoh ...

  10. Selenium2+python自动化51-unittest简介

    前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG,这个招聘的需求上也是经常见到的.python里面也有单元测试框架-unittest,相当于是一个python版的junit. ...