描述

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. nginx 状态监控

    通过查看Nginx的并发连接,我们可以更清除的知道网站的负载情况.Nginx并发查看有两种方法(之所以这么说,是因为笔者只知道两种),一种是通过web界面,一种是通过命令,web查看要比命令查看显示的 ...

  2. WCF使用注意事项

    执行如下 批处理:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil.exe" http://127.0.0.1: ...

  3. lua 闪电特效

    闪电特效 根据不同的起点 终点 资源做倾斜 拉伸 ,主要是计算倾斜角度. function ZyLight:show(params) local params = params or {} local ...

  4. Spring整合Quartz分布式调度(山东数漫江湖)

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...

  5. 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)

    题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...

  6. 完全背包问题入门 (dp)

    问题描述: 有n种重量和价值分别为Wi,Vi的物品,从这些中挑选出总重量不超过W的物品,求出挑选物品的价值总和的最大值,每种物品可以挑选任意多件. 分析: 令dp[i+1][j]表示从前i件物品中挑选 ...

  7. HDU 1205 吃糖果 (数学)

    题目链接 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃 ...

  8. MSSQL 构建临时表SQL

    declare @StartQuarter int declare @StartYear int declare @EndQuarter int declare @EndYear int declar ...

  9. 【Python学习笔记】Coursera课程《Using Python to Access Web Data 》 密歇根大学 Charles Severance——Week2 Regular Expressions课堂笔记

    Coursera课程<Using Python to Access Web Data > 密歇根大学 Charles Severance Week2 Regular Expressions ...

  10. MD5加密学习

    MD5(Message Digest --消息摘要算法)算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错),任何长度的任意内容都可以用MD5计算出散列值.主要作用是[验明“ ...