http://poj.org/problem?id=1686
题意:判断两个公式是否正确,它不是判断两个式子是否一样,二是判断结果。
今天下午老师讲数据结构,讲完了栈,做几道题练练吧 题意: //栈 中缀转化为后缀 //基本规则: //1.读到一个操作数时,立即输出该数,操作符不立即输出.(你可以存在一个临时数组中) //2.比较栈顶操作符与遇到的输入操作符之间的优先级,如果栈顶操作符的优先级高,则出栈。否则,压栈。 //3.遇到(,压栈,直到遇到)出栈。 #include<iostream> #include<cstdio> #include<string.h> #include<map> #include<stack> #define max 101 using namespace std; map<char,int> ma; char root[max]; int Judge(char a) { if(a>='a'&&a<='z'||a>='A'&&a<='Z'||a>='1'&&a<='9') return 1; return 0; } void Convert(char ch[]) { /* for(int i=0;i<strlen(ch);i++) printf("%c",ch[i]); printf("\n"); */ stack<char> start; int len=strlen(ch); // printf("%d\n",len); int i; int Top=0; for(i=0;i<len;i++) { if(Judge(ch[i])) { root[Top++]=ch[i]; } else { switch( ch[i] ) { // printf("fdsdfsd\n"); case '(': start.push( ch[i] ); break; case ')': while(start.top()!='(') { root[Top++]=start.top();//将()内的数放的临时数组中。 start.pop(); } start.pop();//pop()出')'; break; case '+': case '-': case '*': while((!start.empty())&&ma[start.top()]>=ma[ch[i]]) { root[Top++]=start.top(); start.pop(); } start.push(ch[i]); break; } } } while(!start.empty()) { root[Top++]=start.top(); start.pop(); } root[Top]=0; } int sum() { stack<int> end; int len=strlen(root); int i; for( i=0;i<len;i++) { if(Judge(root[i])) { if(root[i]>='1'&&root[i]<='9') end.push(root[i]-'0'); else end.push((int)root[i]); } else { int num1,num2; num1=end.top(); end.pop(); num2=end.top(); end.pop(); switch(root[i]) { case '*': end.push(num1*num2); break; case '-': end.push(num2-num1); break; case '+': end.push(num1+num2); break; } } } return end.top(); } int main() { char cha1[max],cha2[max]; int N; ma['+']=2; ma['-']=2; ma['*']=3; ma['(']=1; cin>>N; getchar(); int a,b; while(N--) { cin.getline(cha1,100,'\n'); cin.getline(cha2,100,'\n'); Convert(cha1); a=sum(); Convert(cha2); b=sum(); if(a==b) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }