棧的表示式之計算中綴、字首和字尾表示式
阿新 • • 發佈:2018-12-26
1.計算中綴表示式
//判斷運算子優先順序 int getPriority(char op) { if(op=='+'||op=='-') return 0; else return 1; } //計算表示式 int calsub(float opnd1,char op,float opnd2,float &result) { if(op=='+') result=opnd1+opnd2; if(op=='-') result=opnd1-opnd2; if(op=='*') result=opnd1*opnd2; if(op=='\') { if(fabs(opnd2)<MIN) return 0; else result=opnd1/opnd1; } return 1; } //計算棧 int calstack(float s1[],int &top1,float s2[],int &top2) { float opnd1,opnd2;char op; int flag; op=s1[top1--]; opnd2=s2[top2--]; opnd1=s2[top2--]; flag=calsub(opnd1,op,opnd2,result); s2[++top2]=result; return flag; } float calinfix(char exp[]) { char s1[maxsize];int top1=-1; char s2[maxsize];int top2=-1; int i=0; while(exp[i]!='\0') { if(exp[i]>='0'&&exp[i]<='9') { s2[++top2]=exp[i]; i++; } else if(exp[i]=='(') { s1[++top1]=exp[i]; i++; } else if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='\') { if(top1==-1||s1[top1]=='('||getPriority(exp[i])>getPriority(s1[top1])) { s1[++top1]=exp[i]; i++; } else { //計算 int flag=calstack(s1,top1,s2,top2); if(flag==0) return 0; } } else if(exp[i]==')') { while(s1[top1]!='(') { //計算 int flag=calstack(s1,top1,s2,top2); if(flag==0) return 0; } --top1; ++i; } } while(top1!=-1) { //計算 int flag=calstack(s1,top1,s2,top2); if(flag==0) return 0; } return s2[top2]; }
2.計算字尾表示式(次頂 op 棧頂)
float calPostFix(char exp[]) { float s[maxsize];int top=-1; for(int i=0;exp[i]!='\0';i++) { if('0'<=exp[i]&&exp[i]<='9') s[++top]=exp[i]-'0'; else { float opnd1,opnd2,result; char op;int flag; opnd2=s[top--];op=exp[i]; opnd1=s[top--]; flag=calsub(opnd1,op,opnd2,result); if(flag==0) { cout<<"error"<<endl; break; } s[++top]=result; } } return s[top]; }
3.計算字首表示式(棧頂op次頂)
float calPreFix(char exp[],int len) { float s[maxsize];int top=-1; for(i=len-1;i>=0;i--) { if('0'<=exo[i]&&exp[i]<='9') s[++top]=exp[i]-'0'; else { float opnd1,opnd2,result; char op; int flag; opnd1=s[top--]; opnd2=s[top--]; flag=calsub(opnd1,op,opnd2,result); if(flag==0) { cout<<"error"<<endl; break; } s[++top]=result; } } return s[top]; }