NYOJ35 表达式求值
表达式求值
- 描述
- ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
- 输入
- 第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0 - 输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。
- 样例输入
-
2
1.000+2/4=
((1+2)*5+1)/4= - 样例输出
-
1.50
4.00#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iomanip>
using namespace std; class OPTR //运算符栈
{
private:
char s[];
int length; public:
OPTR()
{
length = -;
} char pop()
{
return s[length--];
} void push(char c)
{
s[++length] = c;
} char get_top()
{
return s[length];
} void clear()
{
length = -;
}
}; class OPND //操作数栈
{
private:
double a[];
int length; public:
OPND()
{
length = -;
} double pop()
{
return a[length--];
} void push(double b)
{
a[++length] = b;
} double get_top()
{
return a[length];
} void clear()
{
length = -;
}
}; double operate(double a, double b, char c) //根据符号进行相应的运算
{
double result;
if (c == '+')
result = a + b; else if (c == '-')
result = a - b; else if (c == '*')
result = a*b; else if (c == '/')
result = a / b; return result;
} int get_position(char c) //获取符号的下标
{
char s[] = { '+','-','*','/','(',')','=' };
int i;
int length;
int position; position = -;
length = strlen(s);
for (i = ;i < length;i++)
{
if (s[i] == c)
{
position = i;
break;
}
} return position;
} char precede[][]= //优先级表
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
}; bool in(char c) //判断是不是操作数
{
char s[] = { '+','-','*','/','(',')','=' };
int i;
int length; length = strlen(s);
for (i = ;i < length;i++)
{
if (s[i]==c)
break;
} if (i<length)
return true; else
return false;
} int main()
{
char s[];
char temp[];
int i;
int j;
int k;
OPTR optr;
OPND opnd;
char top;
int flag;
int l;
double a;
double b;
int length;
int T; cin >> T;
while (T--)
{
optr.clear();
opnd.clear();
optr.push('='); //让第一个操作符与'='比较 cin >> s;
length = strlen(s);
l = ;
flag = ;
for (i = ;i<length;i++)
{
if (s[i] == '=' && optr.get_top() == '=') //终止条件
break; if (in(s[i]) == false)
{
temp[l++] = s[i];
flag = ;
} else
{
if (flag == )
{
temp[l] = '\0';
flag = ;
l = ; a = atof(temp);
opnd.push(a);
} top = optr.get_top();
j = get_position(top);
k = get_position(s[i]); if (precede[j][k] == '<')
{
optr.push(s[i]);
} else if (precede[j][k] == '=')
{
optr.pop();
} else if (precede[j][k] == '>')
{
b = opnd.pop();
a = opnd.pop();
optr.pop(); a = operate(a, b, top);
opnd.push(a);
i--;
}
}
}
cout << setiosflags(ios::fixed) << setprecision() << opnd.get_top() << endl;
}
return ;
}
NYOJ35 表达式求值的更多相关文章
- 【NYOJ-35】表达式求值——简单栈练习
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- HNU 12817 Shipura(表达式求值)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12817 解题报告:定义两种运算符号,一种是>>,就 ...
随机推荐
- [POJ3417]Network/闇の連鎖
Description 传说中的暗之连锁被人们称为 Dark. Dark 是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它.经过研究,你发现 Dark 呈现无向图的结构,图中有 N 个节点和两类边 ...
- ActiveMQ应用
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...
- 87. [NOIP2000] 乘积最大
★☆ 输入文件:cjzd.in 输出文件:cjzd.out 简单对比 时间限制:1 s 内存限制:128 MB 问题描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国 ...
- 第3章 DOM
1.节点,dom有3种节点,元素节点,文本节点,属性节点 2.元素节点是dom的原子,所有的属性节点和文本节点都被元素包含,但并不是所有的元素都包含他们 3.继承,节点树上的元素将继承父元素的样式和属 ...
- Android Studio3.0打包APK的时候 报错:
Error:Execution failed for task ':app:transformDexWithDexForRelease'.> com.android.build.api.tran ...
- tp登陆注册(转)
登录时,更新用户数据,登录ip和登录时间,以及登录次数+1,此实现方便不知是否合适,待验证.源码地址:https://github.com/grh0812/thinkphp-login-registe ...
- CMD命令行提示被禁用的情况下如何继续使用命令行工具执行命令
1.直接在Windows搜索 左下 输入要执行的 CMD 命令单句.多句同时执行没有试出来. 暂时记录这一条.2016-12-20
- 部署bugzilla(bugzilla+apache+mysql+linux)
工作原因,需要部署bugzilla.在此,容我新造个轮子.官方轮子:https://bugzilla.readthedocs.org/en/latest/installing/quick-start. ...
- 【C++】朝花夕拾——树(开篇)
树 ===================我是分割线====================== 1. 定义: 一些结点的集合,集合可以为空.定义树的自然方式是递归的方法. 2. 相关概念: 根(ro ...
- Android开发使用控件入门--环境搭建
Android开发使用控件入门--环境搭建 软件名称(,梦,,想.CAD ,控件) 1. 环境搭建: 3 1.1. 安装Eclipse 3 1.2. 下载JDK 3 1.3. 下载Android S ...