描述

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<stdlib.h>
int map[7][7]= //算符间的优先关系,100表示不会出现的情况
{
{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,100},
{1,1,1,1,100,1,1},
{-1,-1,-1,-1,-1,100,0}
};
int cam(char c)
{
switch(c)
{
case '+':
return 0;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
case '(':
return 4;
case ')':
return 5;
case '#':
return 6;
}
}
double sol(double x,char c,double y)
{
switch(c)
{
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
}
}
int z(char c)
{
if('0'<=c&&c<='9'||c=='.')
return 1;
if(c==' ')
return -1;
return 0;
}
char str[1005];
char optr[1005];
double opnd[1005];
int main()
{
int t1,t2,k,len;
char ch,zz;
int temp1,temp2;
double a,b;
int t;
scanf("%d",&t);
getchar();
while(t--)
{
gets(str);
len=strlen(str);
str[len-1]='#'; //处理的等于号
t1=t2=k=0;
optr[t1++]='#';
ch=str[k++];
while(ch!='#'||optr[t1-1]!='#')
{
if(z(ch)==1) //操作数入栈
{
opnd[t2++]=atof(&str[k-1]); //把字符串转换成浮点数
while(z(str[k])==1)
k++;
ch=str[k++];
}
else if(z(ch)==-1)
ch=str[k++];
else
{
temp1=cam(optr[t1-1]);
temp2=cam(ch);
if(map[temp1][temp2]==-1) //栈顶元素优先权低
{
optr[t1++]=ch;
ch=str[k++];
}
else if(map[temp1][temp2]==0) //脱括号并接受下一个字符
{
t1--;
ch=str[k++];
}
else //退栈并将运算结果
{
zz=optr[--t1];
a=opnd[--t2];
b=opnd[--t2];
opnd[t2++]=sol(b,zz,a);
}
}
}
printf("%.2lf\n",opnd[0]);
}
return 0;
} //#include<stdio.h>
//#include<stdlib.h>
//
////数据栈
//typedef struct DA
//{
// float data[1000];
// int pop;
//} SDA;
//
////运算符栈
//typedef struct OP
//{
// char op[1000];
// int pop;
//} SOP;
//
////初始化数据栈
//int InitSDA(SDA * p)
//{
// p->pop = 0;
// return 0;
//}
//
////初始化运算符栈
//int InitSOP(SOP * p)
//{
// p->pop = 0;
// (p->op[p->pop]) = '=';
// (p->pop)++;
// return 0;
//}
//
////数据入栈
//int PushSDA(SDA * p, float d)
//{
// if(p->pop < 1000)
// {
// p->data[p->pop] = d;
// (p->pop)++;
// return 0;
// }
// else
// return 1; //栈满
//}
//
////运算符入栈
//int PushSOP(SOP * p, char c)
//{
// if(p->pop < 1000)
// {
// p->op[p->pop] = c;
// (p->pop)++;
// return 0;
// }
// else
// return 1; //栈满
//}
//
////数据出栈
//int PopSDA(SDA * p, float * d)
//{
// (p->pop)--;
// if(p->pop >= 0)
// {
// *d = p->data[p->pop];
// return 0;
// }
// else
// return 1;
//}
//
////运算符出栈
//int PopSOP(SOP * p, char * c)
//{
// (p->pop)--;
// if(p->pop >= 0)
// {
// *c = p->op[p->pop];
// return 0;
// }
// else
// return 1;
//}
//
////从s[*pc]开始获取一个浮点数
//int StrToInt(char s[], int * pc, float *pout)
//{
// char buf[100];
// int i = 0;
//
// if(s[*pc]<'0' || s[*pc]>'9')
// return 1;
// else
// {
// while((s[*pc] >= '0' && s[*pc] <= '9') || s[*pc] == '.')
// {
// buf[i] = s[*pc];
// (*pc)++;
// i++;
// }
// buf[i] = '\0';
// *pout = (float)atof(buf);
// return 0;
// }
//}
//
////从s[*pc]获取一个char
//int StrToChar(char s[], int *pc, char *pout)
//{
// if('+'==s[*pc]||'-'==s[*pc]||'*'==s[*pc]||'/'==s[*pc]||'('==s[*pc]||')'==s[*pc])
// {
// *pout = s[*pc];
// (*pc)++;
// return 0;
// }
// else
// return 1;
//}
//
////获取优先级
//char GetPri(char c1, char c2)
//{
//
// char f[7][7] = {'>', '>', '<', '<', '<', '>', '>',
// '>', '>', '<', '<', '<', '>', '>',
// '>', '>', '>', '>', '<', '>', '>',
// '>', '>', '>', '>', '<', '>', '>',
// '<', '<', '<', '<', '<', '=', '\0',
// '>', '>', '>', '>', '\0', '>', '>',
// '<', '<', '<', '<', '<', '\0', '=',
// };
//
// int i=0, j=0;
// switch(c1)
// {
// case '+':
// i = 0;
// break;
// case '-':
// i = 1;
// break;
// case '*':
// i = 2;
// break;
// case '/':
// i = 3;
// break;
// case '(':
// i = 4;
// break;
// case ')':
// i = 5;
// break;
// case '=':
// i = 6;
// break;
// }
// switch(c2)
// {
// case '+':
// j = 0;
// break;
// case '-':
// j = 1;
// break;
// case '*':
// j = 2;
// break;
// case '/':
// j = 3;
// break;
// case '(':
// j = 4;
// break;
// case ')':
// j = 5;
// break;
// case '=':
// j = 6;
// break;
// }
// return f[i][j];
//}
//
////计算表达式
//float Operate(float a, char op, float b)
//{
// switch(op)
// {
// case '+':
// return a + b;
// case '-':
// return a - b;
// case '*':
// return a * b;
// case '/':
// return a / b;
// default:
// return 0;
// }
//}
//
//int main(void)
//{
// char s[10][1000];
// int c = 0;
// float bufda;
// char bufop;
// float a, b;
// SDA sda;
// SOP sop;
// int n;
// int i;
//
// scanf("%d", &n);
// for(i = 0; i < n; i++)
// scanf("%s", s[i]);
// for(i = 0; i < n; i++)
// {
// c = 0;
// InitSDA(&sda); //初始化数据栈
// InitSOP(&sop); //初始化符号栈
// while(s[i][c] != '=' || sop.op[sop.pop - 1] != '=') // 计算未完成
// {
// if(0 == StrToInt(s[i], &c, &bufda))
// PushSDA(&sda, bufda); //数据入栈
// else
// {
// switch(GetPri(sop.op[sop.pop - 1], s[i][c]))
// {
// case '<':
// if(0 == StrToChar(s[i], &c, &bufop))
// PushSOP(&sop, bufop);
// break;
// case '=':
// PopSOP(&sop, &bufop);
// c++;
// break;
// case '>':
// PopSOP(&sop, &bufop);
// PopSDA(&sda, &b);
// PopSDA(&sda, &a);
// PushSDA(&sda, Operate(a, bufop, b));
// break;
// }
// }
// }
// PopSDA(&sda, &a);
// printf("%.2f\n", a);
// }
// return 0;
//}
// //C++
//#include<queue>
//#include<stack>
//#include<vector>
//#include<math.h>
//#include<cstdio>
//#include<sstream>
//#include<numeric>//STL数值算法头文件
//#include<stdlib.h>
//#include <ctype.h>
//#include<string.h>
//#include<iostream>
//#include<algorithm>
//#include<functional>//模板类头文件
//using namespace std;
//
//const int INF=0x3f3f3f3f;
//const int maxn=110000;
//typedef long long ll;
//
//int priority(char c)
//{
// if(c == '=') return 0;
// if(c == '+') return 1;
// if(c == '-') return 1;
// if(c == '*') return 2;
// if(c == '/') return 2;
// return 0;
//}
//
//void compute(stack<double>& Num,stack<char>& Op)
//{
// double b = Num.top();
// Num.pop();
// double a = Num.top();
// Num.pop();
// switch(Op.top())
// {
// case '+':
// Num.push(a+b);
// break;
// case '-':
// Num.push(a-b);
// break;
// case '*':
// Num.push(a*b);
// break;
// case '/':
// Num.push(a/b);
// break;
// }
// Op.pop();
//}
//
//int main()
//{
// int z;
// char str[1005];
// stack<double> Num;
// stack<char> Op;
// scanf("%d",&z);
// while(z--)
// {
// scanf("%s",str);
// int len = strlen(str);
// for(int i=0; i<len; i++)
// {
// if(isdigit(str[i]))
// {
// double n = atof(&str[i]);
// while(i<len && (isdigit(str[i]) || str[i]=='.'))
// i++;
// i--;
// Num.push(n);
// }
// else
// {
// if(str[i] == '(')
// Op.push(str[i]);
// else if(str[i] == ')')
// {
// while(Op.top()!='(')
// compute(Num,Op);
// Op.pop();
// }
// else if(Op.empty() || priority(str[i])>priority(Op.top()))
// Op.push(str[i]);
// else
// {
// while(!Op.empty() && priority(str[i])<=priority(Op.top()))
// compute(Num,Op);
// Op.push(str[i]);
// }
// }
// }
// Op.pop();
// printf("%.2f\n",Num.top());
// Num.pop();
// }
// return 0;
//}

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

  1. nyoj 表达式求值

    35-表达式求值 内存限制:64MB 时间限制:3000ms Special Judge: Noaccepted:19 submit:26 题目描述: ACM队的mdd想做一个计算器,但是,他要做的不 ...

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

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

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

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

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

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

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

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

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

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

  7. 用Python3实现表达式求值

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

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

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

  9. nyoj305_表达式求值

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

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

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

随机推荐

  1. bzoj 1774: [Usaco2009 Dec]Toll 过路费 ——(改)floyd

    Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫 ...

  2. Mayor's posters(线段树+离散化+区间染色)

    题目链接:http://poj.org/problem?id=2528 题目: 题意:将n个区间进行染色(对于同一个区间,后一次染色会覆盖上一次的染色),问最后可见的颜色有多少种. 思路:由于区间长度 ...

  3. Codeforces Round #478 (Div. 2)

    题目链接:http://codeforces.com/contest/975 A. Aramic script time limit per test:1 second memory limit pe ...

  4. CursorFileManager对cursor文件的读写

    public class CursorFileManager implements CursorManager{public void write(String key, LongCursor cur ...

  5. js删除数组中重复的元素

    1.方法一 将数组逐个搬到另一个数组中,当遇到重复元素时,不移动,若元素不重复则移动到新数组中 function unique(arr){ var len = arr.length; var resu ...

  6. free函数在操作系统内存中的实现【转】

    转自:http://www.2cto.com/kf/201210/160985.html 我一次性malloc十个单位节点的内存空间出来赋值给L, 现在我想一次性删除从第3个到第6个节点,我是这么做的 ...

  7. Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)【转】

    转自:http://blog.csdn.net/droidphone/article/details/8112948 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 数据结 ...

  8. GOLANG编译安装

    GO这个编译器搞的比较混乱,GO本身是汇编+C开发出来的,后来因为觉得自己牛逼,然后用GO语言又写了一次编译器,所以中途抛弃了C,不过这种做法好与不好很难说,go真的这么有自信用自己语言写自己的编译器 ...

  9. 怎么快速入门一个老的java项目

    作者:eilen著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.有文档肯定先看文档,先看设计文档,产品的.技术的设计文档,接口文档写的好的可以看看,要是写的不好不着急看. 2 ...

  10. IE中部分版本的浏览器对Select标签设置innerHTML无效的问题

    这样写的代码:document.getElementById('data_list').innerHTML = data;//data是ajax返回的数据 结果发现在ie10的兼容模式下面下拉框没有内 ...