NYOJ 35 表达式求值
一个模板了 哈哈.
这题由于已经包括了整形、浮点形了,以后也不须要特别处理了。
/*
这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达式
第二步,然后再使用一个stack,计算后缀表达式的结果。这一步非常easy出错,考虑到浮点数的问题。
*/
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <stack>
#include <iomanip>
using namespace std;
int cmp(char ch) // 运算符优先级
{
switch(ch)
{
case '+':
case '-': return 1;
case '*':
case '/': return 2;
default : return 0;
}
}
void change(char *s1,char *s2) // 中缀表达式转变后缀表达式
{
stack <char> s;
s.push('#');
int i = 0,len=strlen(s1),cnt=0;
while(i < len-1) //如今输入的是1.000 +2 /4=。假设是1.000+2/4的话须要把-1去掉
{
if(s1[i]==' ')
{
i++;
continue;
}
else if(s1[i] == '(')
{
s.push(s1[i++]);
}
else if(s1[i] == ')')
{
while(s.top() != '(')
{
s2[cnt++]=s.top();
s2[cnt++]= ' ';
s.pop();
}
s.pop();
i++;
}
else if(s1[i] == '+'||s1[i] == '-'||s1[i] == '*'||s1[i] == '/')
{
while(cmp(s.top()) >= cmp(s1[i]))
{
s2[cnt++]=s.top();
s2[cnt++]= ' ';
s.pop();
}
s.push(s1[i]);
i++;
}
else
{
while('0' <= s1[i]&&s1[i] <= '9'||s1[i] == '.')
{
s2[cnt++]=s1[i++];
}
s2[cnt++]= ' ';
}
}
while(s.top() != '#')
{
s2[cnt++]=s.top();
s2[cnt++]= ' ';
s.pop();
}
s2[cnt]='\0';
}
double value(char *s2) // 计算后缀表达式,得到其结果。
{
stack < double> s;
double x,y;
int i = 0,len=strlen(s2);
while(i < len)
{
if(s2[i] == ' ')
{
i++;
continue;
}
switch(s2[i])
{
case '+': x = s.top(); s.pop(); x += s.top(); s.pop(); i++; break;
case '-': x = s.top(); s.pop(); x =s.top()-x; s.pop(); i++; break;
case '*': x = s.top(); s.pop(); x *= s.top(); s.pop(); i++; break;
case '/': x = s.top(); s.pop(); x = s.top()/x; s.pop(); i++; break;
default :
{
x = 0;
while('0' <= s2[i]&&s2[i] <= '9')
{
x = x*10+s2[i] - '0';
i++;
}
if(s2[i] == '.')
{
double k = 10.0;
y = 0;
i++;
while('0' <= s2[i]&&s2[i] <= '9')
{
y += ((s2[i]-'0')/k);
i++;
k *= 10;
}
x += y;
}
}
}
s.push(x);
}
return s.top();
}
char s1[1006],s2[1006];
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(s1);
change(s1,s2);
printf("%.2f\n",value(s2));
}
return 0;
}
/*
2
1.000 +2 / 4=
((1+2 )* 5+1) /4=
*/
NYOJ 35 表达式求值的更多相关文章
- NYOJ 35 表达式求值(逆波兰式求值)
http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...
- NYOJ 35 表达式求值 (字符串处理)
题目链接 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:&quo ...
- NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏
#include<iostream> #include<string> #include<stack> #include<cstdio> using n ...
- NYOJ 1272 表达式求值 第九届省赛 (字符串处理)
title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...
- nyist0j 35 表达式求值
题目链接:表达式求值 该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊................... 所以贴出来纪念一下,并作为一个警示 /**** ps:注意当遇到 ...
- nyoj 305 表达式求值 (递归)
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- NYOJ 305 表达式求值 (字符串处理)
题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...
- nyoj(表达式求值)
描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2 ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
随机推荐
- MSCRM中报表开发一:创建基于SQL报表
1. 新建报表项目.打开SQL Server Business Intelligence Development Studio,点击 文件 > 新建 > 项目,项目类型选择 商 ...
- Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- CSS 小结笔记之变形、过渡与动画
1.过渡 transition 过渡属性用法: transition :ransition-property transition-duration transition-timing-func ...
- 几个python函数
迭代器 fun函数 过滤作用 s=['a', 'b', 'c'] def fun1(s): if s!='a': return s ret filter(fun1, str) print(ret) ...
- OneAPM NI 基于旁路镜像数据的真实用户体验监控
在这个应用无处不在的时代,一次网络购物,一次网络银行交易,一次网络保险的购买,一次春运车票的购买,一次重要工作邮件的收发中出现的延时,卡顿对企业都可能意味着用户忠诚度下降,真金白银的损失. 因而感知真 ...
- Node路由简单的处理
看过node很多例子,都是将路由直接放到入口文件中处理,使得文件显得很大很乱,特别是当一个项目变大,有上百甚至上千的路由,那该怎么办? 最近在想如何将一个个的路由放到一个单独的模块中处理,比如'/us ...
- Node.js+Ajax实现物流小工具
半年过去了,好像什么也没干,好像什么也干了. 最近在网易云课堂上看到了这个课程,觉得很有意思,就跟着课程做了一遍,课程地址:http://study.163.com/course/courseMain ...
- 03-02_配置weblogic domain
配置Domain 图形化界面: [Windows] Windows菜单 [windows] config.cmd [Unix/Linux] config.sh 命令行界面: [windows] con ...
- python自学——文件修改
#如何修改文件,我们知道文件因为在磁盘上已经有储存了,后面要更新或修改,只能在在原来文件后面追加使用f=open("wenjian_name","r+",enc ...
- fedora 开启 apache 并 开启目录浏览模式
在内网中 暂时需要一台 文件 服务器,所以准备安装一台 http服务器并开启目录访问权限.这次使用 apache 在 fedora 28 机器上: 因为 fedora 28 已经包含 httpd 软件 ...