题目链接

描述

聪明的你帮助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

分析:

典型的表达式求值,数据结构书上也有详细的关于表达式求值的介绍,对于一个中缀形式表达式,我们没有办法直接对它进行计算,首先得把它转换为后缀形式,然后利用后缀形式来计算表达式的值。

代码:

#include<string>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char a[1009],b[1009];
char pri[300];
void trans(char a[])///中缀转后缀
{
stack<char>q;///栈用来存储操作数
q.push('=');///用'='压栈,是为了与后来的操作符比较的时候,他的优先级最低
int j=0;
for(int i=0; a[i]!='='; i++)
{
if(a[i]>='0'&&a[i]<='9'||a[i]=='.')///可能有小数
b[j++]=a[i];
else
{
b[j++]='#';///将连着的多个操作数分隔开
if(a[i]=='(')
q.push(a[i]);
else if(a[i]==')')///一直出栈到'('
{
while(q.top()!='(')
{
b[j++]=q.top();
q.pop();
}
q.pop();
}
else
{
while(pri[a[i]]<=pri[q.top()])
{
b[j++]=q.top();
q.pop();
}
q.push(a[i]);
}
}
}
while(q.top()!='=')
{
b[j++]=q.top();
q.pop();
}
b[j++]='=';
b[j]='\0';
} double JiSuan(char b[])
{
//puts(b);
char c[100];
int j=0;
stack<double>st;
for(int i=0; b[i]!='='; i++)
{
if(b[i]>='0'&&b[i]<='9'||b[i]=='.')
c[j++]=b[i];
else
{ if(j!=0)
{
st.push(atof(c));///自动将字符转换为double
// cout<<"c "<<st.top()<<endl;
memset(c,'\0',sizeof(c));
j=0;
}
if(b[i]!='#')
{
double n1;
double n2;
double n3;
switch(b[i])
{
case '+':
n1=st.top();
st.pop();
n2=st.top();
st.pop();
n3=n2+n1;
st.push(n3);
break;
case '-':
n1=st.top();
st.pop();
n2=st.top();
st.pop();
n3=n2-n1;
st.push(n3);
break;
case '*':
n1=st.top();
st.pop();
n2=st.top();
st.pop();
n3=n2*n1;
st.push(n3);
break;
case '/':
n1=st.top();
st.pop();
n2=st.top();
st.pop();
n3=n2/n1;
st.push(n3);
break;
}
}
} }
return st.top();
}
int main()
{
int T;
pri['=']=-1;
pri['(']=0;
pri['+']=1;
pri['-']=1;
pri['*']=2;
pri['/']=2;
pri[')']=3;
scanf("%d",&T);
for(int k=1;k<=T;k++)
{
if(k!=1)
printf("\n");///测试数据的问题,加不加换行都能过
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
scanf(" %s",a);
// puts(a);
trans(a);
for(int i=0; b[i]!='\0'; i++)
{
if(b[i]!='#')
printf("%c",b[i]);
}
printf("\n");
printf("%.2lf\n",JiSuan(b));
}
return 0;
}

NYOJ 267 郁闷的C小加(二) (字符串处理)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. NYOJ-267 郁闷的C小加(二)

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

  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. jetty之maven配置

    <!-- jetty 插件配置 --><plugin> <groupId>org.mortbay.jetty</groupId> <artifac ...

  2. EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

    EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

  3. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  4. Android四大组件之contentProvider

    Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...

  5. Django 2.0 学习(18):Django 缓存、信号和extra

    Django 缓存.信号和extra Django 缓存 由于Django是动态网站,所以每次请求均会去数据库进行相应的操作,当程序访问量大时,耗时必然会显著增加.最简单的解决方法是:使用缓存,缓存将 ...

  6. [poi2011]bzoj 2277 —— strongbox·[洛谷3518]

    ·问题描述· 有一个密码箱,0到n-1中的某些数是它的密码.且满足:如果a和b都是它的密码,那么(a+b)%n也是它的密码.某人试了k次密码,前k-1次都失败了,最后一次成功. 问:该密码箱最多有多少 ...

  7. 【题解】CF#611 H-New Year and Forgotten Tree

    有趣啊~手玩一下这棵树,发现因为连边只对相连点的位数有限制,我们可以认为是在往一棵已经有 m 个结点的树上挂叶子结点直到满足要求.(m = log(10) n).注意由于 m 超级无敌小,我们可以直接 ...

  8. 【CF625E】Frog Fights(模拟)

    [CF625E]Frog Fights(模拟) 题面 CF 洛谷 翻译: 有\(n\)只青蛙在一个被分为了\(m\)等分的圆上,对于每份顺时针依次标号. 初始时每只青蛙所在的位置是\(p_i\),速度 ...

  9. mysqldump备份恢复

    数据库的备份恢复是DBA的必修课,本文首先讲解mysqldump完整备份恢复的操作方法,演示数据库完整备份的基本过程.然后再模拟数据库遭遇灾难性破坏,配合bin-log日志实验数据库灾难性恢复的步骤. ...

  10. [CTSC2016]时空旅行

    description 题面 solution 线段树分治+斜率优化毒瘤题 题目可以简化为: 你要维护一个包含元素\((x,c)\)的集合 修改操作为从以前的一个版本更新,修改内容为添加或删除一个元素 ...