1、 .
C语言编写四那么运算
#include
2、loc size typedefstructFStack//stack of int { float* base; float* top; intstacksize; }FStack; voidInit(FStack* s) { s->base = (float*)malloc(STACK_SIZE * sizeof(FStack)); if (!s->base) { printf("overflow!\n"); return; } s->top = s->base; s->stacksize = STACK_SIZE; } boolisEm
3、pty(FStack* s) { if (s->top == s->base) { returntrue; } else { returnfalse; } } voidPush(FStack* s, floate) { if (s->top - s->base >= s->stacksize) { printf("stack is full!\nrealloc %d\n", STACK_INCREMENT); s->base = (float*)realloc(s->base, (s->stacksize + sizeof(FStack)));
4、if (!s->base) { printf("overflow!\n"); return; } s->top = s->base + s->stacksize; s->stacksize += STACK_INCREMENT; } *(s->top) = e; (s->top)++; } floatGetTop(FStack* s) { if (s->top == s->base) { printf("stack is empty!\n"); return 0; } floate = *(s->top - 1); returne;
5、 } voidPop(FStack* s) { if (s->top == s->base) { printf("stack is empty!\n"); return; } s->top--; } typedefstructCStack//stack of char { char* base; char* top; intstacksize; }CStack; voidInit(CStack* s) { s->base = (char*)malloc(STACK_SIZE * sizeof(CStack)); if (!s->base)
6、 { printf("overflow!\n"); return; } s->top = s->base; s->stacksize = STACK_SIZE; } boolisEmpty(CStack* s) { if (s->top == s->base) { returntrue; } else { returnfalse; } } voidPush(CStack* s, inte) { if (s->top - s->base >= s->stacksize) { printf("stack is full!\nreal
7、loc %d\n", STACK_INCREMENT); s->base = (char*)realloc(s->base, (s->stacksize + sizeof(CStack))); if (!s->base) { printf("overflow!\n"); return; } s->top = s->base + s->stacksize; s->stacksize += STACK_INCREMENT; } *(s->top) = e; (s->top)++; } charGetTop(CStack* s) { if (s->to
8、p == s->base) { printf("stack is empty!\n"); return 0; } chare = *(s->top - 1); returne; } voidPop(CStack* s) { if (s->top == s->base) { printf("stack is empty!\n"); return; } s->top--; } boolisOper(charch) { if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%
9、') { returntrue; } else { returnfalse; } } intPriority(charch) { intp; switch(ch) { case'(': p = 0; break; case'+': case'-': p = 1; break; case'*': case'/': case'%': p = 2; break; } returnp; } floatCalculate(floatf1, floatf2, charoper) { floatf3; switch(oper
10、) { case'+': f3 = f1 + f2; break; case'-': f3 = f1 - f2; break; case'*': f3 = f1 * f2; break; case'%': f3 = (float)((int)f1 % (int)f2); break; case'/': if (f2 == 0) { printf("\nDevided by zero!"); exit(1); } else { f3 = f1 / f2; } break; } returnf3; } floatStr
11、toFloat(char* str, int* pos) { floatfRes; inti = *pos; intk; charn[50]; for (k = 0; str[i] >= '0' && str[i] <= '9' || str[i] == '.'; i++, k++) { n[k] = str[i]; } n[k] = '\0'; *pos = i; fRes = atof(n); returnfRes; } boolCheck(char* str) { inti = 0; while (str[i] != '\0') { if
12、 (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/' && str[i] != '%' && str[i] != '.' && str[i] != '(' && str[i] != ')' && (str[i] < '0' || str[i] > '9')) { returnfalse; } i++; } returntrue; } voidmain() { charexp[100]; inti; floatf, f1, f2; charoper; FStackfstack;
13、 CStackcstack; Init(&fstack); Init(&cstack); printf("The expression is:"); gets(exp); if (!Check(exp)) { printf("input error! exit now!\n"); exit(1); } for (i = 0; exp[i] != '\0' && exp[i] != -52; i++) { if (!isOper(exp[i])) { f = StrtoFloat(exp, &i); Push(&fstack, f); } if (
14、isOper(exp[i])) { if (!isEmpty(&cstack)) { while (!isEmpty(&cstack) && Priority(exp[i]) <= Priority(GetTop(&cstack))) { oper = GetTop(&cstack); Pop(&cstack); f2 = GetTop(&fstack); Pop(&fstack); f1 = GetTop(&fstack); Pop(&fstack); f = Calculate(f1, f2, oper); Push(&fstack, f);
15、 } Push(&cstack, exp[i]); } else { Push(&cstack, exp[i]); } } elseif (exp[i] == '(') { Push(&cstack, exp[i]); } elseif (exp[i] == ')') { while (GetTop(&cstack) != '(' && !isEmpty(&cstack)) { oper = GetTop(&cstack); Pop(&cstack); f2 = GetTop(&fstack); Pop(&fs
16、tack); f1 = GetTop(&fstack); Pop(&fstack); f = Calculate(f1, f2, oper); Push(&fstack, f); } Pop(&cstack); } } while (!isEmpty(&cstack)) { oper = GetTop(&cstack); Pop(&cstack); f2 = GetTop(&fstack); Pop(&fstack); f1 = GetTop(&fstack); Pop(&fstack); f = Calculate(f1, f2, oper); Push(&fstack, f); } printf("\nThe result is:%f\n", GetTop(&fstack)); Pop(&fstack); } . .word..






