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 解题报告:定义两种运算符号,一种是>>,就 ...
随机推荐
- laravel学习一
Laravel 是一款简洁,优雅的一款框架,可以说是入门TP后的第二款可以选择的框架. 目录部分: app -> 自己写的代码 http -> Controller -> 控制器 b ...
- POJ 3608 旋转卡壳
思路: 旋转卡壳应用 注意点&边 边&边 点&点 三种情况 //By SiriusRen #include <cmath> #include <cstdi ...
- *RelativeLayout的布局参数含义表,如android:layout_alignParentTop等
RelativeLayout 参数规则 一个控件的位置由横,纵两个方向上的距离决定 控件默认的位置在左上角. 单独使用以下属性都只是改变一个方向的相对位置. 如:只使用了android:layout_ ...
- C#学习-多线程小练习
1.双色球案例 namespace _18双色球案例 { public partial class Form1 : Form { private bool IsRunning; private Lis ...
- 实例化WebService实例对象时出现localhost未引用命名空间
//实例化WebService实例对象 localhost.WebService WebserviceInstance = new localhost.WebService(); 在实例化WebSer ...
- Js变量类型
值类型和引用类型 值类型(基本类型):5种,Number String Boolean null undefined var a=10; var b=a; a=2; console.log(b); a ...
- 自定义样式 dialog
自定义样式 dialog,可设置界面外点击屏幕外和返回键 是否消失 基本用法如下: CustomDialog.Builder customBuilder = new CustomDialog.Bui ...
- git常用命令和github
工作区:就是你的工作目录 暂存区:它像个缓存区域,临时保存你的改动 版本区:就是你的git仓库 HEAD:相当于一个指针,指向你最近一次提交后的结果 git status 查看状态 git add . ...
- UI布局只关乎三件事情:尺寸、位置、组织
UI布局只关乎三件事情:尺寸.位置.组织. 组织分为两类: 单元组织: 集合组织: 混合组织.
- 【前端路由】Vue-router 中hash模式和history模式的区别
咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...