一个模板了 哈哈.

这题由于已经包括了整形、浮点形了,以后也不须要特别处理了。

/*
这里主要是逆波兰式的实现,使用两个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 表达式求值的更多相关文章

  1. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  2. NYOJ 35 表达式求值 (字符串处理)

    题目链接 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:&quo ...

  3. NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏

    #include<iostream> #include<string> #include<stack> #include<cstdio> using n ...

  4. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  5. nyist0j 35 表达式求值

    题目链接:表达式求值 该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊................... 所以贴出来纪念一下,并作为一个警示 /**** ps:注意当遇到 ...

  6. nyoj 305 表达式求值 (递归)

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  7. NYOJ 305 表达式求值 (字符串处理)

    题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...

  8. nyoj(表达式求值)

    描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2 ...

  9. 数据结构--栈的应用(表达式求值 nyoj 35)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...

随机推荐

  1. 【CDQ分治】[HNOI2010]城市建设

    题目链接 线段树分治+LCT只有80 然后就有了CDQ分治的做法 把不可能在生成树里的扔到后面 把一定在生成树里的扔到并查集里存起来 分治到l=r,修改边权,跑个kruskal就行了 由于要支持撤销, ...

  2. canvas与svg特性和使用对比

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  3. 从零开始学习html(九)CSS的继承、层叠和特殊性

    一.继承 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" co ...

  4. Echarts地图绘制(散点,色卡)

    echarts绘制地图时,提供了js内部注册,也提供了json数据手动注册,这两种都可以绘制对应地图,但有一点不同的是,js内部只注册了中国地图和世界地图,而json数据提供了世界,中国,中国城市的数 ...

  5. 纯小白入手 vue3.0 CLI - 2.1 - 组件 ( component )

    vue3.0 CLI 真小白入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0Study  ...

  6. docker 开发常用命令总结

    Docker 常用命令总结,镜像下载,到docker容器创建,常用docker命令的 增删查 1.镜像下载,从hub.docker.com中下载最新版本的postgres docker pull po ...

  7. 实验:JS判断浏览器中英文版本

    <script type="text/javascript"> var lang = (navigator.systemLanguage?navigator.syste ...

  8. SpringBoot2+WebSocket之聊天应用实战(优化版本)

    背景 之前再SpringBoot2.0集成WebSocket,实现后台向前端推送信息中已经进行过一次demo,而这次的demo更加明确,优化了相关代码,为IM而生 前提 前提当然是导入相关的包,以及配 ...

  9. 简单CNN 测试例

    1.训练数据: import tensorflow as tf import cv2 import os import numpy as np import time import matplotli ...

  10. 快速配置webpack 4.x

    区分开发模式和生产模式: npm run start——开发模式,启用devServer,文件的改动实时更新.刷新 npm run build——生产模式,打包文件到dist文件夹 // packag ...