资源描述
. .
C语言编写四那么运算
#include<stdio.h>//计算器
#include<malloc.h>
#defineSTACK_SIZE 100 //max size of the stack
#defineSTACK_INCREMENT 10 //realloc 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;
}
boolisEmpty(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)));
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;
}
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)
{
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!\nrealloc %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->top == 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 == '%')
{
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)
{
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;
}
floatStrtoFloat(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 (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;
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 (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);
}
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(&fstack);
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..
展开阅读全文