/*小弟刚学c数据结构 这是清华大学严蔚敏数据结构那本书上的用堆栈实现的 自己写的不好的地方 各位大哥恳请指教用#做为表达式结束符*/ #include #define STACK_SIZE 100
#define STACKINCREMENT 10
#define elemtype char
typedef struct{ elemtype *base; elemtype *top; int stacksize; }*ptstack,sqstack;
void initstack(ptstack s )
{ s->base=(elemtype *)malloc(STACK_SIZE*sizeof(elemtype)); s->top=s->base; s->stacksize=STACK_SIZE; }
int stackempty(ptstack s) {
if(s->base==s->top) return 1; else return 0;
}
void push(ptstack s,elemtype e) {
if(s->top-s->base>=s->stacksize) {
s->base=(elemtype *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(elemtype)); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e;
}
elemtype pop(ptstack s) {elemtype e; e=*--s->top; return e; }
elemtype gettop(ptstack s) {elemtype e; e=*(s->top-1); return e; }
#define elemtype2 int typedef struct{elemtype2 *base; elemtype2 *top; int stacksize; }*ptstack2,sqstack2;
void initstack2(ptstack2 s ) { s->base=(elemtype2 *)malloc(STACK_SIZE*sizeof(elemtype2));
s->top=s->base; s->stacksize=STACK_SIZE; }
int stackempty2(ptstack2 s) { if(s->base==s->top) return 1; else return 0; }
void push2(ptstack2 s,elemtype2 e) {if(s->top-s->base>=s->stacksize) {s->base=(elemtype2 *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(elemtype2)); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e; }
elemtype2 pop2(ptstack2 s) {elemtype2 e; e=*--s->top; return e; }
elemtype2 gettop2(ptstack2 s) {elemtype2 e; e=*(s->top-1); return e; }
int in(char c) { switch(c) { case '+': return 0; case '-': return 1; case '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; case '#':return 6; default:return 7; } }
static char youxian[7][7]= { {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} };
elemtype2 t=0; int chartoint(char c){int i; i=(int)c-48; return i; }
char precede(char c,char d) { int m,n; m=in(c); n=in(d); return youxian[m][n]; }
int operate(int a,char c,int b){ switch(c){case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } }
int fourf() {char c,theta;
elemtype2 m,a,b;
ptstack OPTR; ptstack2 OPND;
initstack(OPTR);push(OPTR,'#'); initstack2(OPND);c=getchar(); while(c!='#'||gettop(OPTR)!='#'){ if(in(c)==7){ while(in(c)==7){m=chartoint(c);t=t*10+m; c=getchar();} push2(OPND,t);t=0;} else switch(precede(gettop(OPTR),c)) {case '<':push(OPTR,c);c=getchar(); break; case '=':;pop(OPTR);c=getchar(); break; case '>': theta=pop(OPTR); b=pop2(OPND);a=pop2(OPND); push2(OPND,operate(a,theta,b)); break; case ' ': printf("error"); break; } } return gettop2(OPND); }
main() { printf("%d",fourf()); getch();
}