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 解题报告:定义两种运算符号,一种是>>,就 ...
随机推荐
- SQL 经典语句大全
原地址:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库 CREATE DATABASE ...
- linux编译安装gcc5.3.0
1.下载GCC5.3.0安装包 #su #cd /opt #wget http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz 2.解压 #.tar. ...
- rman 问题
1. RMAN Repeatedly Fail To Backup Archivelogs with RMAN-20242 Cause: There is a mis-match between th ...
- IPython、Notebook、qtconsole使用教程
IPython.Notebook.qtconsole使用教程 上一篇为Python,IPython,qtconsole,Notebook,Jupyter快速安装教程 1. 使用IPython 自动补全 ...
- python加载不了cookirlib模块的问题
Python 3 改成 http.cookiejar了,所以import cookielib只要改成import http.cookiejar,就可以了.
- python自动化--模块操作之re、MySQL、Excel
一.python自有模块正则 import re # re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None print(re.match("www ...
- C++(extern关键字的理解和作用深入)
extern关键字的理解和作用深入 extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数, 也会在当前文件的后面或者其它文件中定义 引 ...
- Windows下压缩成tar.gz格式
tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ...
- 安装mask-rcnn问题汇总
1. I download file from https://github.com/waleedka/coco. Then I placed the file in Mask_RCNN-master ...
- Markdown(github)语法
<< 访问 Wow!Ubuntu NOTE: This is Simplelified Chinese Edition Document of Markdown Syntax. If yo ...