NYOJ-35-表达式求值
http://acm.nyist.net/JudgeOnline/problem.php?pid=35
很好的一题,利用栈来计算表达式的值
四则运算的规则:1.先乘除,后加减;2.从左算到右;3.先括号内,后括号外
注意把字符串转换成浮点数可以使用atof函数
#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;
}
分享到:
相关推荐
算法-矩形嵌套(NYOJ-16)(包含源程序).rar
适合新手,详情可见我博客
爬虫地址:https://code.csdn.net/youqi1shi/ojrobot/tree/master nyoj的所有题目,每个问题都转化成了单独的网页,没有其他零碎内容。
NYOJ离线版.chm、北大ACM题库、北大ACM题解答
双线程动态规划问题,很值得练习。传一个ac代码,测试一下csdn的功能。
经典算法,最大单调递增子序列,查看最多能嵌入多少个矩形
字典树,Trie树,查找插入效率都很高的一种高级数据结构。
由于微信小程序没有方法可以获得当前用户所在城市的信息,所以需要调用方法来获取城市信息,用了两个方法去发送请求并返回城市信息 1. @Controller public class WechatLocationManager { private Logger logger ...
这个小程序的主要目的是为了用户用微信的用户信息登录后将用户信息授权存入自己的数据库中,这样以后每次微信登录得到的code 所得到的 openid 可以在项目的数据库中查到该用户的相关信息。 在测试的过程中,需要用户...
前期小程序开发只进行到根据微信用户登录获取的code 去微信的API去获取到该用户的openId和session_key,到了第二阶段,老大让我重写OAuthManager的代码来实现微信小程序和微信公众号平台获取用户信息的优化,即将...
南阳理工学院stl练习场全部ac代码!
南阳理工学院OJ第1版解题报告V1.0.pdf
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。