表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述
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 表达式求值的更多相关文章

  1. 【NYOJ-35】表达式求值——简单栈练习

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

  2. 表达式求值(noip2015等价表达式)

    题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...

  3. 用Python3实现表达式求值

    一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...

  4. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  5. nyoj305_表达式求值

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

  6. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

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

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

  8. NOIP2013普及组 T2 表达式求值

    OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...

  9. HNU 12817 Shipura(表达式求值)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12817 解题报告:定义两种运算符号,一种是>>,就 ...

随机推荐

  1. 思维题 HDOJ 5288 OO’s Sequence

    题目传送门 /* 定义两个数组,l[i]和r[i]表示第i个数左侧右侧接近它且值是a[i]因子的位置, 第i个数被选择后贡献的值是(r[i]-i)*(i-l[i]),每个数都枚举它的因子,更新l[i] ...

  2. 【雅虎2017】一个在线展示广告的CVR预估框架实践

    论文A Practical Framework of Conversion Rate Prediction for Online Display Advertising 定期更新,获取更多,欢迎sta ...

  3. 1102 A-B数对

    题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数 ...

  4. 添加telnet命令

    打开控制面板,打开程序和功能,看到左边有个“打开或关闭Windows功能 ,打开找到telnet客户端,把这2项都勾选上,然后确定就可以了 注意,如果只要telnet别人的话,就选telnet客户端. ...

  5. Android基础TOP6_3:Gally和ImageSwitcher实现画廊

    结构: Activity: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  6. FPGA编程技巧系列之输入输出偏移约束详解

    1.   偏移约束的作用 偏移约束(Offset Constraint)用来定义一个外部时钟引脚(Pad)和数据输入输出引脚之间的时序关系,这种时序关系也被称为器件上的Pad-to-Setup或Clo ...

  7. STA之Concepts (1)

    Static Timing Analysis is one of the many techniques available to verify the timing of a digital des ...

  8. python学习笔记(6)——字典(Dictionary)

    dict= {key1 : value1, key2 : value2 ...} 关键词:字典中元素成对出现- key:value 格式- 两端{ } ,键:值,每对键值间用 ,隔开. 键key-唯一 ...

  9. (转)全文检索技术学习(二)——配置Lucene的开发环境

    http://blog.csdn.net/yerenyuan_pku/article/details/72589380 Lucene下载 Lucene是开发全文检索功能的工具包,可从官方网站http: ...

  10. 网络编程-socketserver

    网络编程使用socketserver,通常包括以下几步:一.定义类,并继承socketserver.BaseRequestHandler 二.重写handle方法 三.实例化TCPServer,并传递 ...