表达式求值(数据结构书上栈的应用之中的一个)
Posted wzzkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式求值(数据结构书上栈的应用之中的一个)相关的知识,希望对你有一定的参考价值。
主要内容:表达式求值。提交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=ly.top(),ly.pop(); left_value=ly.top(),ly.pop(); val=cal_value(left_value,right_value,Op); ly.push(val); i--;break;//表达式运算后字符指针要后移 } } } printf("%.2lf\n",ly.top()); } return 0; } /* 2 ((-2+3)*1.2+2)= ((-2+3)*10/2)= */
后来ac了看了别人用书上的方法进行分装,可是认为太麻烦了。一直不知道究竟哪种方法好。。。
以上是关于表达式求值(数据结构书上栈的应用之中的一个)的主要内容,如果未能解决你的问题,请参考以下文章