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 ...
随机推荐
- SpringBoot简介、特点
##SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包.SpringBoot整合了所有的框架,并通过一行简单的main方法启动应用. ##微框 ...
- [可能不知道]什么是PeopleSoft的JOLT以及相关进程
PeopleSoft applecation server依赖于Jolt,Jolt是与Tuxedo配套的产品,可以处理所有web请求.换句话说,Jolt是application server与web ...
- 二叉搜索树(Binary Search Tree)实现及测试
转:http://blog.csdn.net/a19881029/article/details/24379339 实现代码: Node.java //节点类public class Node{ ...
- 有道云笔记 markdown 本地资源图片 粘贴到word居然粘贴不过去 资源名不能有汉子
刚开始使用有道云笔记,整理一个说明文档的时候,出现了问题 我将一个图片保存到桌面,文件名是中文汉字的图片.在云笔记里能正常显示,但是粘贴到word里面,也没有图片.我尝试了半天.最后居然发现只要把文件 ...
- CSS 小结笔记之滑动门技术
所谓的滑动门技术,就是指盒子背景能够自动拉伸以适应不同长度的文本.即当文字增多时,背景看起来也会变长. 大多数应用于导航栏之中,如微信导航栏: 具体实现方法如下: 1.首先每一块文本内容是由a标签与s ...
- Git创建本地仓库并推送至远程仓库
作为一名测试同学,日常工作经常需要checkout研发代码进行code review.自己极少有机会创建仓库,一度以为这是一个非常复杂过程.操作一遍后,发现也不过六个步骤,so,让我们一起揭开这神秘面 ...
- android:screenOrientation属性
今天工作中发现一个activity的android:screenOrientation属性设置为behind,平时经常看到的是landscape.portrait,一时没有反应过来,故查了一下andr ...
- aix rootvg镜像
就一般生产系统而已,操作系统层面都要进行备份,而最常见的操作系统备份方式之一就是做镜像(mirror),而实践过程中,往往是把rootvg这个卷组做镜像操作.查看rootvg是否已经进行镜像方法: 1 ...
- SQL2005的SSMS连接SQL2012会有问题
SQL2005的SSMS连接SQL2012会有问题 如果用SQL2005的SSMS连接SQL2012会产生“索引数组越界”的问题并且使用不了 反过来使用SQL2012的SSMS连接SQL2005就没有 ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...