nyoj(表达式求值)
描述
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(表达式求值)的更多相关文章
- nyoj 表达式求值
35-表达式求值 内存限制:64MB 时间限制:3000ms Special Judge: Noaccepted:19 submit:26 题目描述: ACM队的mdd想做一个计算器,但是,他要做的不 ...
- NYOJ 1272 表达式求值 第九届省赛 (字符串处理)
title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...
- NYOJ 35 表达式求值(逆波兰式求值)
http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- nyoj 305 表达式求值 (递归)
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
随机推荐
- .NET RabbitMQ
在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这 种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方,比如发送短 ...
- 【BZOJ】1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
[题意]给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度. [算法]平衡树+数学转化 [题解]统计前缀和sum[i] ...
- 【HDU】2222 Keywords Search
[算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...
- Lua中调用C++方法
目前项目,使用了Lua脚本,至于使用Lua的好处不再赘述了.于是对Tolua做了一些小小的学习,总结一下吧. 主要说一下如何在Lua中调用C++方法. Lua调用C++的桥梁,是tolua.tolua ...
- js中字符串的操作
1.length 获取字符串长度 var str = "hello world"; alert(str); 2.索引 通过下标获取字符串指定位置的字符,但是不能改变该索引对应的值 ...
- Runas replacement tool
1. RunAsSpc Runas 无法在脚本中输入密码,可以使用RunAsSpc替代. RunAsSpc = runas + password + encryption https://robotr ...
- 今天安装了arch,感觉不错,这速度可以
虽然没有想想中的那么那么快,不过已经可以了 总结一下遇到的问题以及i自己安装的软件 1.u盘硬盘不能自动挂载 安装gvfs 2.不能读写挂载 安装ntfs-3g 3.时间不对 照wiki上的说 #ln ...
- monkey测试===关于monkey测试的介绍
https://www.cnblogs.com/lauren1003/p/6193277.html
- SqlServer开启CLR使用(C#)DLL实现实时Socket通知
--1.默认情况下,SQL Server中的CLR是关闭的,所以我们需要执行如下命令打开CLR: reconfigure GO -- DROP FUNCTION dbo.fnScoketSend -- ...
- ICTPOS3.0 词性标注集
Ag 形语素 形容词性语素.形容词代码为a,语素代码g前面置以A. a 形容词 取英语形容词adjective的第1个字母. ad 副形词 直接作状语的形容词.形容词代码a和副词代码d并在一起. an ...