基本思想:设两个栈,一个保存操作数,一个保存操作符,其他操作优先级和细节问题与后缀表达式基本相同
程序代码:
#include<stdio.h>
#include<stdlib.h> #define MAX 100 typedef struct {//创建操作数栈 int data[MAX]; int top; }SeqStack,*PSeqStack; typedef struct {//创建操作符栈 char data[MAX]; int top; }SeqStack1,*PSeqStack1; //创建一个空栈 PSeqStack Init_Seqstack() { PSeqStack S; S=(PSeqStack )malloc(sizeof(SeqStack)); if(S ) S->top=-1; return S; } PSeqStack1 Init_Seqstack1() { PSeqStack1 S; S=(PSeqStack1 )malloc(sizeof(SeqStack1)); if(S ) S->top=-1; return S; } //判断栈是否为空 int Empty_Seqstack(PSeqStack S) { if(S->top==-1) return 1; else return 0; } int Empty_Seqstack1(PSeqStack1 S) { if(S->top==-1) return 1; else return 0; } //压栈 int Push_Seqstack(PSeqStack S,int x) { if(S->top==MAX-1) return 0; else { S->top++; S->data[S->top]=x; return 1; } } int Push_Seqstack1(PSeqStack1 S,char x) { if(S->top==MAX-1) return 0; else { S->top++; S->data[S->top]=x; return 1; } } //删除栈顶元素 int Pop_Seqstack(PSeqStack S,int *x) { if(Empty_Seqstack(S)) return 0; else { *x=S->data[S->top]; S->top--; return 1; } } int Pop_Seqstack1(PSeqStack1 S,char *x) { if(Empty_Seqstack1(S)) return 0; else { *x=S->data[S->top]; S->top--; return 1; } } //得到栈顶元素 int Gettop_Seqstack(PSeqStack S,int *x) { if(Empty_Seqstack(S)) return 0; else *x=S->data[S->top]; return 1; } int Gettop_Seqstack1(PSeqStack1 S,char *x) { if(Empty_Seqstack1(S)) return 0; else *x=S->data[S->top]; return 1; } //删除栈 void Destroy_seqstack(PSeqStack *S) { if(*S) free(*S); *S=NULL; return ; } void Destroy_seqstack1(PSeqStack1 *S) { if(*S) free(*S); *S=NULL; return ; } int isNUM(char ch) {//判断是否是字符 if(ch>='0'&&ch<='9') return 1; else return 0; } int isop(char op)//判断是否为操作符的方法 { switch(op) { case '+': case '-': case '*': case '/': return 1;//如果是操作符则返回数值1 default : return 0;//其他为返回数值0,代表假 } } int YouXianJi(char op)//判断字符的优先级方法 { switch(op) { case '=':return -1;//将=入栈为判断结束标记 case '(':return 0; case '*': case '/':return 2;//乘除的优先级高 case '+': case '-':return 1; default :return -1; } } int jisuan(char a[]) { int i=0; int e; int x1,x2,c;//接受数据栈的值 char e1; PSeqStack num;// PSeqStack1 op;// num=Init_Seqstack(); op=Init_Seqstack1(); Push_Seqstack1(op,'=');//用来判断操作符结束 while(a[i]!='=') { if(isNUM(a[i])) {//是数字的话,直接入数字栈中 Push_Seqstack(num,a[i]-'0'); i++; } else if(a[i]=='(') {//如果是的话,直接入栈,无需比较 Push_Seqstack1(op,a[i]); i++; } else if(a[i]==')') {//如果遇到),则一直出栈计算,直到遇到( while(Gettop_Seqstack1(op,&e1)!='(')// { switch(Pop_Seqstack1(op,&e1),e1) { case '+':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1+x2; Push_Seqstack(num,c); break; case '-':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1-x2; Push_Seqstack(num,c); break; case '*':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1*x2; Push_Seqstack(num,c); break; case '/':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1/x2; Push_Seqstack(num,c); break; default:break; } } Pop_Seqstack1(op,&e1);// i++; } else if(isop(a[i]))//是否是操作符 { while(YouXianJi(a[i])<=YouXianJi(Gettop_Seqstack1(op,&e1)))//如果当前的操作符小于栈顶,则出栈计算 { switch(Pop_Seqstack1(op,&e1),e1) { case '+':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1+x2; Push_Seqstack(num,c); break; case '-':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1-x2; Push_Seqstack(num,c); break; case '*':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1*x2; Push_Seqstack(num,c); break; case '/':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1/x2; Push_Seqstack(num,c); break; default:break; // default:break; } } Push_Seqstack1(op,a[i]); i++; } if(a[i]=='=')//如果是=,证明a[i]以到结尾 { while((Gettop_Seqstack1(op,&e1),e1)!='=')//如果不是=的话,证明栈里还有操作符,继续计算 { switch(Pop_Seqstack1(op,&e1),e1) { case '+':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1+x2; Push_Seqstack(num,c); break; case '-':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1-x2; Push_Seqstack(num,c); break; case '*':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1*x2; Push_Seqstack(num,c); break; case '/':Pop_Seqstack(num,&x1); Pop_Seqstack(num,&x2); c=x1/x2; Push_Seqstack(num,c); break; default:break; } } } } // Destroy_seqstack(&num);//不能销毁 // Destroy_seqstack1(&op);//不能销毁,否则返回的e无值 return (Pop_Seqstack(num,&e),e); // } int main() { char a[100]; int result; printf("请输入要计算的表达式:"); // getchar(); scanf("%s",a); getchar(); result=jisuan(a); printf("result=%d\n",result); return 0; }