头文件1。 #ifndef _TT_H_ #define _TT_H_ #include<stdio.h> char Precede(char t1,char t2) { char f; switch(t2) { case '+': case '-':if(t1=='('||t1=='#') f= '<'; else f= '>'; break; case '*': case '/':if(t1=='*'||t1=='/'||t1==')') f= '>'; else f= '<'; break; case '(':if(t1==')') printf("error:/n"); else f= '<'; break; case ')':switch(t1) { case '(':f= '='; break; case'#':printf("error/n"); default :f= '>'; } break; case'#':switch(t1) { case'#':f= '='; break; case'(' :printf("error/n"); default :f= '>'; } } return f; } int In(char c) { switch(c) { case'+' : case'-' : case'*' : case'/' : case'(' : case')' : case'#':return 1; default :return 0; } } int Operate(char a,char x,char b) { switch(x) { case'+':return a+b; case'-':return a-b; case'*':return a*b; } return a/b; } #endif 头文件2: #ifndef _NU_STACK_H #define _NU_STACK_H #include<stdio.h> #define N 20 int nu_stack[N]; int nu_top = 0; void nu_push(int c) { nu_stack[nu_top] = c; nu_top++; } int nu_pop(void) { nu_top--; return nu_stack[nu_top]; } int nu_is_empty(void) { return nu_top == 0; } int nu_get_top() { if (nu_top > 0) return nu_stack[nu_top-1]; else return 0; } #endif 头文件3: #ifndef _CH_STACK_H #define _CHSTACK_H #include<stdio.h> #define Y 20 char ch_stack[Y]; int ch_top = 0; void ch_push(char c) { ch_stack[ch_top] = c; ch_top++; } char ch_pop(void) { if(ch_top != 0) { ch_top--; return ch_stack[ch_top]; } else return 0; } int ch_is_empty(void) { return ch_top == 0; } int ch_get_top() { if (ch_top > 0) return ch_stack[ch_top-1]; else return 0; } #endif man: #include<stdio.h> #include"nu_stack.h" #include"ch_stack.h" #include"tt.h" #define N 20 int expression(char *p) { char a,b,c,x; int i= 0; ch_push('#'); c=p[i++]; x=ch_get_top(); while(c!='#'||x!='#') { if(In(c)) switch(Precede(x,c)) { case'<' :ch_push(c); c=p[i++]; break; case'=' :x=ch_pop(); c=p[i++]; break; case'>' :x = ch_pop(); b = nu_pop(); a = nu_pop(); nu_push(Operate(a,x,b)); } else if(c>='0'&&c<='9') { nu_push(c-48); c = p[i++]; } else printf("error!/n"); x = ch_get_top(); } x = nu_pop(); if(!nu_is_empty()) printf("error !!!/n"); printf("x = %d/n", x); } int main(void) { int i; char str[N]; for( i = 0; i < N; i++ ) { scanf("%c",&str[i]); if(str[i] == '/n') { str[i]='#'; break; } } expression(str); }