回复 2楼 寒风中的细雨

#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int y,z; char theta; typedef struct{ int *base; int *top; int stacksize; }Sqstack1; typedef struct S2{ char *base; char *top; int stacksize; }Sqstack2; void Initstack1(Sqstack1 *S) { S->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S->base)printf("内存分配错误"); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } void Initstack2(Sqstack2 *Q) { Q->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!Q->base)printf("内存分配错误"); Q->top=Q->base; Q->stacksize=STACK_INIT_SIZE; } void Push1(Sqstack1 *S,int e) { if(S->top-S->base>=S->stacksize) { S->base=(int *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int)); if(!S->base)printf("从新分配内存错误"); S->top=S->base+S->stacksize; } *S->top++=e; } void Push2(Sqstack2 *Q,char e) { if(Q->top-Q->base>=Q->stacksize) { Q->base=(char *)realloc(Q->base,(Q->stacksize+STACKINCREMENT)*sizeof(char)); if(!Q->base)printf("从新分配内存错误"); Q->top=Q->base+Q->stacksize; } *Q->top++=e; } int Gettop1(Sqstack1 *S) { int e; if(S->top=S->base)printf("栈已经为空,无法执行!"); e=*(S->top-1); return e; } char Gettop2(Sqstack2 *Q) { char c; if(Q->top=Q->base)printf("栈已经为空,无法执行!"); c=*(Q->top-1); return c; } int Pop1(Sqstack1 *S) { int e; if(S->top==S->base)printf("ERROR\n"); e=*--S->top; return e; } char Pop2(Sqstack2 *Q) { char c; if(Q->top==Q->base)printf("ERROR\n"); c=*--Q->top; return c; } char Precede(char a1,char a2) { if((a1=='+'||a1=='-')&&(a2=='+'||a2=='-'||a2==')'||a2=='#'))return '>'; else if((a1=='+'||a1=='-')&&(a2=='*'||a2=='/'||a2=='('||a2=='#'))return '<'; else if((a1=='*'||a1=='/')&&(a2=='+'||a2=='-'||a2=='*'||a2=='/'||a2==')'||a2=='#'))return '>'; else if((a1=='*'||a1=='/')&&a2=='(')return '<'; else if(a1=='('&&(a2=='+'||a2=='-'||a2=='*'||a2=='/'||a2=='('))return '>'; else if(a1=='('&&a2==')')return '='; else if(a1==')'&&(a2=='+'||a2=='-'||a2=='*'||a2=='/'||a2==')'||a2=='#'))return '>'; else if(a1=='#'&&(a2=='+'||a2=='-'||a2=='*'||a2=='/'||a2=='('))return '<'; else if(a1=='#'&&a2=='#')return '='; else return(0); } Operate(int n,char c,int m) { if(c=='+')return(n+m); else if(c=='-')return(n-m); else if(c=='*')return(n*m); else if(c=='/')return(n/m); else return(0); } void main() { Sqstack1 OPND; Sqstack2 OPTR; int a,t=1,add=0,k=0; Initstack1(&OPND); Push2(&OPTR,'#'); Initstack2(&OPTR); char c; c=getchar(); while(c!='#'||Gettop2(&OPTR)!='#') { while(c>='0'&&c<='9') { a=c-48; add=add+a*t; t=t*10; k=1; c=getchar(); }; if(k==1) Push1(&OPND,add); else switch(Precede(Gettop2(&OPTR),c)){ case '<'://栈顶元素优先权低 Push2(&OPTR,c); c=getchar();break; case '='://脱括号并接受下一字符 Pop2(&OPTR); c=getchar();break; case '>'://退栈并将运算结果入栈 theta=Pop2(&OPTR); y=Pop1(&OPND);z=Pop1(&OPND); Push1(&OPND,Operate(y,theta,z));break; default:break; } printf("***"); } printf("\n结果是:%d",Gettop1(&OPND)); }
[ 本帖最后由 烧包谷 于 2010-12-5 23:14 编辑 ]