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 解题报告:定义两种运算符号,一种是>>,就 ...
随机推荐
- Linux学习笔记之Linux相关知识
[想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...
- 图论 HDOJ 5348 MZL's endless loop
题目传送门 /* 题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果 图论:一个图,必定存在偶数个奇度顶点.那么从一个奇度定点深搜, ...
- 全面学习ORACLE Scheduler特性(12)使用Windows和Window Groups
七.使用Windows 此Windows非彼Windows,通常说的Windows是指盖首富的操作系统,而此处所说的Windows,是指SCHEDULER特性中的一个子项.在SCHEDULER中,WI ...
- tensorFlow资源
1,[莫烦]Tensorflow tutorials (Eng Sub) 神经网络 http://www.bilibili.com/video/av10118932/index_35.html#pag ...
- Angular——MVC模式开发实战
创建项目 创建工作目录 使用bower下载需要插件 git init.add.commit之后得到分支master,再创建developer分支,然后再此分支上进行具体功能开发 MVC架构 之前小项目 ...
- jsp学习笔记 - 内置对象 session
1.session 主要用来用户的登录和注销 设置用户名,获取用户名 session.setAttribute("username","johnson"); s ...
- 取得数据库中数据 查询条件where使用规则
string where = string.Format("DnX < {0} and DnD > {0} and Types = '{1}' and Type1 = '{2}' ...
- nginx_rewrite规则介绍
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向.rewrite只能放在server{},location{},if{}中,并且只能 ...
- 【转】Go语言入门教程(一)Linux下安装Go
说明 系统是Ubuntu. 关于安装 下载安装包 当前官方下载地址是https://golang.org/dl/,如果不能访问,请自行FQ,FQ是技术工作者的必备技能. 安装 tar -xzvf go ...
- Vscode下调试基于Homestead环境的Laravel框架
PS:最近在学Laravel框架,本机IDE是Vscode,因为Vscode是真的好用!今天突然想调试php代码了,于是疯狂地在网上查资料,经过一上午的不懈努力,终于成功了! 准备工作 首先环境要保证 ...