[Data structures]EvaluateExpression
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1024 typedef int ElemType; typedef struct _SqStack{ ElemType *base; ElemType *top; int stackSize; }SqStack; int InitStack(SqStack *S) { S->base = (ElemType *)malloc(MAX*sizeof(ElemType)); S->top = S->base; S->stackSize = MAX; return 1; } ElemType GetTop(SqStack *S) { return *(S->top - 1); } int Push(SqStack *S, ElemType e) { if(S->top - S->base >= S->stackSize){ return 0; } *(S->top++) = e; } int Pop(SqStack *S, ElemType *e) { if(S->top == S->base){ return 0; }else{ *e = *(--S->top); return 1; } } int StackEmpty(SqStack *S) { if(S->top == S->base){ return 1; }else{ return 0; } } int ClearStack(SqStack *S) { S->top = S->base; return 1; } int PrintStack(SqStack *S) { ElemType *p = S->base; while(p != S->top){ printf("%c", (char)*p); p++; } printf("\n"); return 1; } char OP[] = {7, '+', '-', '*', '/', '(', ')', '#'}; char PRE[][7] = { {'>', '>', '<', '<', '<', '>', '>'}, {'>', '>', '<', '<', '<', '>', '>'}, {'>', '>', '>', '>', '<', '>', '>'}, {'>', '>', '>', '>', '<', '>', '>'}, {'<', '<', '<', '<', '<', '=', ' '}, {'>', '>', '>', '>', ' ', '>', '>'}, {'<', '<', '<', '<', '<', ' ', '='} }; int In(char c, char *array) { int i; for(i=1; i<=array[0]; i++){ if(c == array[i]){ return i; } } return 0; } int Precede(char a, char b) { int na,nb; na = In(a, OP) - 1; nb = In(b, OP) - 1; return PRE[na][nb]; } int Operate(int a, char x, int b) { int ret; switch(x){ case '+': ret = a+b; break; case '-': ret = a-b; break; case '*': ret = a*b; break; case '/': ret = a/b; break; } return ret; } ElemType EvaluateExpression() { SqStack OPTR; SqStack OPND; int c; int x; int a; int b; InitStack(&OPTR); InitStack(&OPND); Push(&OPTR, '#'); c = getchar(); while(c != '#' || GetTop(&OPTR) != '#'){ if(!In(c, OP)){ Push(&OPND, c-'0'); c = getchar(); }else{ switch(Precede(GetTop(&OPTR), c) ){ case '<': Push(&OPTR, c); c = getchar(); break; case '=': Pop(&OPTR, (int *)&x); c = getchar(); break; case '>': Pop(&OPTR, &x); Pop(&OPND, &b); Pop(&OPND, &a); Push(&OPND, Operate(a, x, b)); break; default: return 0; break; } } } return GetTop(&OPND); } void main() { printf("log.anycle.com\n\n"); printf("Conversion:\n"); printf("= %d\n", EvaluateExpression() ); printf("\n"); }
日历
最新微语
- 有的时候,会站在分叉路口,不知道向左还是右
2023-12-26 15:34
- 繁花乱开,鸟雀逐风。心自宁静,纷扰不闻。
2023-03-14 09:56
- 对于不可控的事,我们保持乐观,对于可控的事情,我们保持谨慎。
2023-02-09 11:03
- 小时候,
暑假意味着无忧无虑地玩很长一段时间,
节假意味着好吃好喝还有很多长期不见的小朋友来玩...
长大后,
这是女儿第一个暑假,
一个半月...
2022-07-11 08:54
- Watching the autumn leaves falling as you grow older together
2018-10-25 09:45
分类
最新评论
- Goonog
i get it now :) - 萧
@Fluzak:The web host... - Fluzak
Nice blog here! Also... - Albertarive
In my opinion you co... - ChesterHep
What does it plan? - ChesterHep
No, opposite. - mojoheadz
Everything is OK!... - Josephmaigh
I just want to say t... - ChesterHep
What good topic - AnthonyBub
Certainly, never it ...
发表评论: