题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35

题目:

                    表达式求值
                时间限制:3000 ms | 内存限制:65535 KB
描述
  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 "stdio.h"
#include "string.h"
#include "stack"
using namespace std; #define N 2005 char str[N];
int OPS[];
char table[][]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=<",">>>>>>>","<<<<<<="};
//上面语句定义了操作符之间的优先级,从0~6依次为+-*/()=七种运算符 double Calculate(char ch,double x1,double x2)
{
if(ch=='+')
return x1+x2;
else if(ch=='-')
return x1-x2;
else if(ch=='*')
return x1*x2;
else if(ch=='/')
return x1/x2;
} int main()
{
int T;
int i,j;
int len;
memset(OPS,-,sizeof(OPS));
OPS['+'] = ;
OPS['-'] = ;
OPS['*'] = ;
OPS['/'] = ;
OPS['('] = ;
OPS[')'] = ;
OPS['='] = ;
scanf("%d",&T);
getchar();
while(T--)
{
scanf("%s",str+);
str[] = '=';
stack<double> q; //操作数栈
stack<char> t; //操作符栈
len = strlen(str);
for(i=; i<len; )
{
if(OPS[str[i]]==-) //若当前字符不为运算符,将这个数字读下来加入操作数栈(double类型)
{
int wei=;
bool flag = true;
double temp=;
for(j=i; OPS[str[j]]==-; ++j)
{
if(str[j]=='.'){ flag = false; continue; }
temp = temp*+str[j]-'';
if(!flag) wei*=;
}
temp = temp/wei;
i = j;
q.push(temp);
}
else
{
if(t.empty()) //若操作符栈为空,直接将下一个操作符加入操作符队列
t.push(str[i++]);
else
{
char ch1 = t.top();
char ch2 = str[i];
if(table[OPS[ch1]][OPS[ch2]]=='>') //前一个操作符先执行,则先执行前一个操作符,再加入这个操作符
{
double x2 = q.top();
q.pop();
double x1 = q.top();
q.pop();
char ch = t.top();
t.pop();
double x = Calculate(ch,x1,x2); //运算这两个数
q.push(x);
}
else if(table[OPS[ch1]][OPS[ch2]]=='<') //前一个操作符后执行,则直接将当期这个操作如入栈
t.push(str[i++]);
else if(table[OPS[ch1]][OPS[ch2]]=='=') //'='的情况表示括号对,后者等号对,将这两个操作符都消去。
t.pop(), i++;
}
}
}
printf("%.2lf\n",q.top());
q.pop();
}
return ;
}

数据结构--栈的应用(表达式求值 nyoj 35)的更多相关文章

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

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

  2. 数据结构课程设计四则运算表达式求值(C语言版)

    本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

  3. [河南省ACM省赛-第四届] 表达式求值(nyoj 305)

    栈的模拟应用: #include<iostream> #include<cstdio> #include<cstring> #include<string&g ...

  4. POJ 2106-Boolean Expressions,双栈运用类似表达式求值!

    Boolean Expressions 首先声明此题后台可能极水(毕竟这种数据不好造!).昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错 ...

  5. 南阳 oj 表达式求值 题目35 数据结构 NYO题目链接

     建议不会的看别人的代码自己在之上模拟一遍,仅仅要耐心模拟就会做出来 题目链接:http://acm.nyist.net/JudgeOnline/problem.php? pid=35 #incl ...

  6. LeetCode150 逆波兰表达式求值

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

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

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

  8. C++表达式求值(利用数据结构栈)

    唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的 ...

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

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

随机推荐

  1. SQL年月日方面的查询信息

    这是计算一个月第一天的SQL 脚本:   SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天 SELECT DATEADD(mm, DAT ...

  2. 重构第31天 使用多态替代条件语句( Replace conditional with Polymorphism)

    理解:本文中的”使用多态代替条件判断”是指如果你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用. 详解:本文展示了面向对象编程的基础之一“多 ...

  3. private、 protected、 public、 internal 修饰符

    private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 在同一 ...

  4. 百度地图API自定义地图

    http://api.map.baidu.com/lbsapi/creatmap/index.html http://developer.baidu.com/map/index.php?title=w ...

  5. wpf 查找页面的所有TextBox

    private void EnumVisual(Visual myVisual) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount( ...

  6. js限制input输入

    1.取消按钮按下时的虚线框,在input里添加属性值 hideFocus 或者 HideFocus=true <input type="submit" value=" ...

  7. 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...

  8. [PHP] 读取大文件并显示

    使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据 PHP代码: <?php class Test{ //日志路径 const LOG_PATH=& ...

  9. Linux下建立Nexus私服

    Linux下建立Nexus私服 要安装3个东西,然后配置私服: 1.JDK 2.Maven 3.Nexus 然后配置 1.JDK的安装 下载JDK安装包,格式为RPM格式,安装即可 安装程序 #rpm ...

  10. DDD开发框架ABP之导航菜单

    每一个网站都会有导航菜单(通常不止一个),ASP.NET Boilerplate(后文简称ABP)提供了一种创建和使用菜单的通用架构,利用架构我们可以方便的创建菜单并显示给用户.本文主要说明菜单的创建 ...