#include "Calculator.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define FIRST 2;
#define SECOND 3;
#define THIRD 4;
int sum;
int main()
{
Num *s;
Ch *p;
char str[100];
Num_Init (s);
Ch_Init (p);
printf("Please enter you need to calculate formula:\n");
gets(str);
int i=0;
while (str[i] != '\0')
{
if (math(str[i])) //判断是否是数字
{
sum=0;
while (math(str[i]))//得到数字
{
char ch[2] = {str[i++]};
int a = atoi(ch);
sum = getmath(a,sum);
}
Num_Push(s,sum);
}
else
{
if (Jud(p,str[i]) == TRUE) //判断计算符是否入栈
{
Ch_Push(p,str[i]);
}
else
{
if (str[i] != ')') //“)”一律不入栈
{
int a;
int b;
char c;
Num_Pop(s,&a);
Num_Pop(s,&b);
Ch_Pop(p,&c);
Num_Push(s,Calcu(a, b, c));
Ch_Push(p,str[i]);
}
else
{
do
{
int a;
int b;
char c;
Num_Pop(s,&a);
Num_Pop(s,&b);
Ch_Pop(p,&c);
Num_Push(s,Calcu(a, b, c));
}while(p->ch[p->top] != '(');
char c;
Ch_Pop(p,&c);
}
}
i++;
}
}
while (p->top != -1 ) //取空符号栈,一直进行运算
{
int a;
int b;
char c;
Num_Pop(s,&a);
Num_Pop(s,&b);
Ch_Pop(p,&c);
Num_Push(s,Calcu(a, b, c));
}
printf ("%d\n",s->num[s->top]);
return 0;
}
这次的计算器比前面的那个难多了,一开始并没有编的出来,有的地方的逻辑性太强,在做运算的时候,先把数字进行入栈,在判断符号是否要入栈,栈顶元素为空的时候,除了‘)’其余都入栈,乘除的优先级比加减高,所以栈顶为加减的乘除和‘(’入栈。当下一个运算符为同一级或者低一级的就将栈顶元素取出进行运算后压栈;。重复此过程,一直到最后将运算结果压入栈中。