计算器(2)

#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;
}
这次的计算器比前面的那个难多了,一开始并没有编的出来,有的地方的逻辑性太强,在做运算的时候,先把数字进行入栈,在判断符号是否要入栈,栈顶元素为空的时候,除了‘)’其余都入栈,乘除的优先级比加减高,所以栈顶为加减的乘除和‘(’入栈。当下一个运算符为同一级或者低一级的就将栈顶元素取出进行运算后压栈;。重复此过程,一直到最后将运算结果压入栈中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值