35-表达式求值

内存限制:64MB 时间限制:3000ms Special Judge: No
accepted:19 submit:26

题目描述:

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

逆波兰式(也就是中缀表达式转后缀表达式)

法则:

1)如果遇到数字,我们就直接将其输出。

2)如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。

3)如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈

4)如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈

5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

在此,我们将上述做稍加更改,定一个操作数栈和操作符栈,从左至右扫描中缀表达式,若遇见字符,进入操作数栈,如果遇到非数字时,若操作符栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。

如果遇到一个右括号,出栈并弹出符号,计算操作数栈的定元素的两个,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈,如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,弹出操作符栈顶元素,并弹出操作数栈顶的两个元素,计算结果入栈,然后高优先级的操作符入栈

#include <iostream>
#include <iomanip>
#include <stack>
#include <cstdlib>
using namespace std;
//设置每种操作符的优先权
int priority(char c)
{
if(c=='=')//读取到'='结束
return 0;
if(c=='+'||c=='-')
return 1;
if(c=='*'||c=='/')
return 2;
return 0;
}

void calculate(stack<double>& num,stack<char>& op)//形参设置为引用,所以不用声明为全局变量
{
double r=num.top();//取栈顶元素,先进后出的原则,栈顶的数位操作符右边得数
num.pop();//弹出栈顶元素
double l=num.top();//操作符左边的数
num.pop();
switch(op.top())
{
case '+':
num.push(l+r);
break;
case '-':
num.push(l-r);
break;
case '*':
num.push(l*r);
break;
case '/':
num.push(l/r);
break;
}
op.pop();//运算完之后弹出此操作符
}

int main()
{
int n;
cin>>n;
while(n--)
{
string s;
stack<char> op;//存放操作符的栈
stack<double> num;//存放操作数的栈
cin>>s;
for(int i=0;i<s.length();++i)
{
if(isdigit(s[i]))
{
double t_num=atof(&s[i]);//至于怎么转换的参考链接 http://www.cnblogs.com/tianzeng/p/9038660.html
//cout<<"------->"<<t_num<<endl;
while(i<s.length()&&(isdigit(s[i])||s[i]=='.'))//有可能是小数,此步是把小数存
i++; //后跳过小数
i--;
num.push(t_num);
}
else
{
if(s[i]=='(')
op.push(s[i]);
else if(s[i]==')')
{
while(op.top()!='(')
calculate(num,op);
op.pop();
}
else if(op.empty()||priority(s[i])>priority(op.top()))
op.push(s[i]);
else
{
while(!op.empty()&&priority(s[i])<=priority(op.top()))
calculate(num,op);
op.push(s[i]);
}
}
}
op.pop();
cout<<setiosflags(ios::fixed)<<setprecision(2)<<num.top()<<endl;//精度表达式,
num.pop(); //输出两位小数
}
return 0;
}

nyoj 表达式求值的更多相关文章

  1. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  2. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

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

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

  4. nyoj 305 表达式求值 (递归)

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

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

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

  6. 用Python3实现表达式求值

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

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

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

  8. nyoj305_表达式求值

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

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

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

随机推荐

  1. JSP EL简介

    JSP EL简介:1.语法:    ${expression} 2.[ ]与.运算符    EL 提供“.“和“[ ]“两种运算符来存取数据.     当要存取的属性名称中包含一些特殊字符,如.或?等 ...

  2. hulu

    一. 一开始因为没收到含有共享文档链接的邮件,所以简单自我介绍,聊了几句项目.问了: 1. 玩嗨如果数据库结构变化要怎么办 2. 哈佛项目是否为官方渠道 一直没收到邮件,面试官读网址给我,进到共享文档 ...

  3. 配置postgres9.3间的fdw——实现不同postgres数据库间的互访问

    下面是安装.配置.使用fdw实现postgres数据库间互访问的方法,转载注明出处: 1.源码安装fdw支持(要求数据库源码安装) cd /usr/local/postgresql-9.3.2/con ...

  4. 感知器、logistic与svm 区别与联系

    https://blog.csdn.net/m0_37786651/article/details/61614865 从感知器谈起 对于典型的二分类问题,线性分类器的目的就是找一个超平面把正负两类分开 ...

  5. PHP:第一章——PHP中常量和预定义常量

    <?php /*****************************************************/ //1.常量的定义 //常量:声明一次后长期不变的量,以字母或下划线开 ...

  6. POJ 2195 Going Home 最小费用流 难度:1

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17955   Accepted: 9145 Descr ...

  7. bzoj1617

    题解: dp f[i]表示运i头奶牛需要的时间 f[i]=f[i-j]+a[i]+2*m 然后ans=f[n]-m(最后一次不用跑回来) 代码: #include<bits/stdc++.h&g ...

  8. Mac自带的本地服务器的使用

    1. 打开终端,开启Apache: //开启apache: sudo apachectl start //重启apache: sudo apachectl restart //关闭apache: su ...

  9. Myecilpse web +tomcat 项目: JSP在mysql中创建表

    <%@ page language="java" import="java.util.*" import="com.mysql.jdbc.Dri ...

  10. ZEDGRAPH画图心得,SQL语句构造!!!

    /// <summary> /// 画折线 /// </summary> public void Drawline() { OleDbConnection odcConnect ...