首页 > 代码库 > 表达式求值(数据结构书上栈的应用之中的一个)
表达式求值(数据结构书上栈的应用之中的一个)
主要内容:表达式求值。提交nyoj通过。。。
思路:主要就是一个开两个栈,然后一个操作符栈。一个操作数栈。
。
我的代码例如以下(比較简洁):
/***** Author Gery ******/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<cmath> #include<string> #include<stack> #include<queue> #define eps 1e-9 #define ll long long #define INF 0x3f3f3f3f using namespace std; const int maxn=1000+10; stack<double>ly; stack<char>gery; char str[maxn],op[maxn]; char operation[7][7]//运算符的优先级 { {‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘},//‘+‘ {‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘},//‘-‘ {‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘},//‘*‘ {‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘},//‘/‘ {‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘=‘,‘,‘},//‘(‘ {‘>‘,‘>‘,‘>‘,‘>‘,‘,‘,‘>‘,‘>‘},//‘)‘ {‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘,‘,‘=‘},//‘=‘ }; int get_index(char ch) { switch(ch) { case ‘+‘:return 0; case ‘-‘:return 1; case ‘*‘:return 2; case ‘/‘:return 3; case ‘(‘:return 4; case ‘)‘:return 5; case ‘=‘:return 6; } } char get_prio(char a,char b) { int c=get_index(a); int d=get_index(b); return operation[c][d]; } double cal_value(double a,double b,char c) { switch(c) { case ‘+‘:return a+b; case ‘-‘:return a-b; case ‘*‘:return a*b; case ‘/‘:return a*1.0/b; } } int main() { int t,pd,cnt,i; double temp,left_value,right_value,val; char ch,Op; scanf("%d",&t); while(t--) { scanf("%s",str); ly.empty(); gery.empty(); gery.push(‘=‘); for(i=0;i<strlen(str);i++) { cnt=0,pd=i;//pd为字符指针 if(isdigit(str[i])||str[i]==‘.‘||str[i]==‘-‘)//拼数过程 { while(isdigit(str[pd])||str[pd]==‘.‘||str[pd]==‘-‘) { op[cnt]=str[pd]; cnt++,pd++; } op[cnt]=‘\0‘; temp=atof(op);//系统函数是Ascii to float的缩写。。相似的还有atoi,是把字符串转换成float型的函数 ly.push(temp); i=pd-1; } else { ch=get_prio(gery.top(),str[i]); switch(ch) { case ‘<‘:gery.push(str[i]);break; case ‘=‘:gery.pop();break; case ‘>‘: Op=gery.top(),gery.pop(); right_value=http://www.mamicode.com/ly.top(),ly.pop();"%.2lf\n",ly.top()); } return 0; } /* 2 ((-2+3)*1.2+2)= ((-2+3)*10/2)= */
后来ac了看了别人用书上的方法进行分装,可是认为太麻烦了。一直不知道究竟哪种方法好。。。
表达式求值(数据结构书上栈的应用之中的一个)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。