35-表达式求值

内存限制:64MB
时间限制:3000ms
Special Judge: No

accepted:37
submit:53

题目描述:

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 分析与步骤:
  ①、类似于表达式求解问题需要用到栈(stack)的思想(即就是先进后出)
  ②、遇到数字就将数字放入数字栈中
  ③、遇到字符串就要分开考虑
    1、是‘(’就直接入栈,方便遇到')'时,就将'('以后所有的运算栈带入数字栈运算,结果保存于数字串
    2、如果操作栈为空栈直接入栈
    3、如果操作栈的栈顶元素优先级小于带输入字符的优先级直接入栈
    4、其他情况就是要将数字栈与操作栈结合,算出结果保存在数字栈中
    5、数字栈中的最后一个元素即为题解 核心代码(表达式求值模板);
 int priority(char c) // 表达优先级的大小关系
{
if (c == '*' || c == '/') return ;
if (c == '+' || c == '-') return ;
return ;
} void cal(stack<char> &my_op, stack<double> &my_num) // 将数字栈与操作栈通过引用的形式实现调用与更改
{
double b = my_num.top();
my_num.pop();
double a = my_num.top();
my_num.pop();
switch(my_op.top())
{
case '+': my_num.push(a + b); break;
case '-': my_num.push(a - b); break;
case '*': my_num.push(a * b); break;
case '/': my_num.push(a / b); break;
}
my_op.pop();
}
for(int i = ; i < len; ++ i) // 判断是因该执行什么操作
{
if(isdigit(s[i]))
{
double temp = atof(&s[i]);
while(isdigit(s[i]) || s[i] == '.') ++ i;
my_num.push(temp);
-- i;
}
else if(s[i] == '(')
{
my_op.push(s[i]);
}
else if(s[i] == ')')
{
while(my_op.top() != '(')
cal(my_op, my_num);
my_op.pop();
}
else if(my_op.empty())
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) < priority(s[i]))
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) >= priority(s[i]))
{
while(!my_op.empty() && priority(my_op.top()) >= priority(s[i])) // 比较的是优先级关系不是ASCⅡ
cal(my_op, my_num);
my_op.push(s[i]);
}
}

C/C++代码实现(AC):

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <set> using namespace std;
const int MAXN = ; int priority(char c) // 表达优先级的大小关系
{
if (c == '*' || c == '/') return ;
if (c == '+' || c == '-') return ;
return ;
} void cal(stack<char> &my_op, stack<double> &my_num) // 将数字栈与操作栈通过引用的形式实现调用与更改
{
double b = my_num.top();
my_num.pop();
double a = my_num.top();
my_num.pop();
switch(my_op.top())
{
case '+':
my_num.push(a + b);
break;
case '-':
my_num.push(a - b);
break;
case '*':
my_num.push(a * b);
break;
case '/':
my_num.push(a / b);
break;
}
my_op.pop();
} int main()
{ int t;
scanf("%d", &t);
while(t --)
{
char s[MAXN];
scanf("%s", s);
int len = strlen(s);
stack <double> my_num;
stack <char> my_op; for(int i = ; i < len; ++ i)
{
if(isdigit(s[i]))
{
double temp = atof(&s[i]);
while(isdigit(s[i]) || s[i] == '.') ++ i;
my_num.push(temp);
-- i;
}
else if(s[i] == '(')
{
my_op.push(s[i]);
}
else if(s[i] == ')')
{
while(my_op.top() != '(')
cal(my_op, my_num);
my_op.pop();
}
else if(my_op.empty())
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) < priority(s[i]))
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) >= priority(s[i]))
{
while(!my_op.empty() && priority(my_op.top()) >= priority(s[i])) // 比较的是优先级关系不是ASCⅡ,my_op.top()忘记放在priority中,弄的找了半天的bug,::>_<::
cal(my_op, my_num);
my_op.push(s[i]);
}
}
my_op.pop();
printf("%.2lf\n", my_num.top());
my_num.pop();
}
return ;
}

nyoj 35-表达式求值(stack, 栈的应用)的更多相关文章

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

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

  2. NYOJ 35 表达式求值 (字符串处理)

    题目链接 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:&quo ...

  3. NYOJ 35 表达式求值

    一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...

  4. NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏

    #include<iostream> #include<string> #include<stack> #include<cstdio> using n ...

  5. Matrix Chain Multiplication(表达式求值用栈操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...

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

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

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

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

  8. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

  9. nyist0j 35 表达式求值

    题目链接:表达式求值 该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊................... 所以贴出来纪念一下,并作为一个警示 /**** ps:注意当遇到 ...

随机推荐

  1. IaaS基础平台

    第一部分:IaaS云计算基础架构平台 服务器:先电 任务一.IaaS云平台搭建 基础环境: 1.使用命令行方式设置主机名,防火墙以及 SELinux 设置如下: (1)设置控制节点主机名 contro ...

  2. Flask框架实现给视图函数增加装饰器操作示例

    在@app.route的情况下增加装饰器的写法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...

  3. GPU服务器及计算原理

    图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心.视觉处理器.显示芯片,是一种专门在个人电脑.工作站.游戏机和一些移动设备(如平板电脑.智能手机等)上图 ...

  4. Python爬虫常用小技巧之设置代理IP

    设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...

  5. 使用asp.net core 3.0 搭建智能小车1

    跟随.net core 3.0 一起发布的System.Device.Gpio 1.0已经可以让我们用熟悉的C#原汁原味的开发莓派上面的GPIO了.并且在 Iot.Device.Bindings这个包 ...

  6. 一款用于绘制状态机转换图和流程图的web在线绘图工具

    大型软件系统中离不开各类状态机的处理,日常工作中也涉及到各类事务处理流程:从表现力看文不如表,表不如图:因此日常工作中经常需要绘制各种状态机的状态转换图和流程图,以协助理解代码逻辑和各类事务处理流程等 ...

  7. 在虚拟机上的关于FTP FTP访问模式(匿名)

    小知识 nfs和ftp类似另外一款共享软件 用21号端口 传控制 20号端口 传数据  Windows和虚拟机之间 接下来进行实验 首先在yum资源库中下载 输入命令:yum install vsft ...

  8. 三分钟学会Redis在.NET Core中做缓存中间件

    大家好,今天给大家说明如何在.NET Core中使用Redis,我们在想要辩论程序的好与坏,都想需要一个可视化工具,我经常使用的是一位国内大牛开发的免费工具,其Github地址为: https://g ...

  9. Xshell和Xftp 安装及使用

    Xshell Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机的安全连接以 ...

  10. 小白学 Python(20):迭代器基础

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...