1. 程式人生 > >C語言實現計算器(包含加減乘除和括號)

C語言實現計算器(包含加減乘除和括號)

#include <stdio.h>                          /*包含標頭檔案*/  
#include <stdlib.h>


#define MAX_SIZE 1024                       /*陣列長度*/  


int insert_operand(int *operand , int * top_num ,int num)           /*資料壓入資料棧*/  
{
    (*top_num) ++;  
    operand[*top_num] = num;                    /*儲存資料*/  
    
    return 0;                           /*正常退出*/  
}  


int insert_oper (char * oper , int *top_oper , char ch)             /*操作符壓入符號棧*/  
{  
    (*top_oper)++;  
    oper[*top_oper] = ch;                       /*儲存操作符*/  
    return 0;                           /*正常退出*/  
}  
     
int compare(char *oper , int *top_oper , char ch)                   /*比較操作服優先順序*/  
{     
    if((oper[*top_oper] == '-' || oper[*top_oper] == '+')           /*判斷當前優先順序是否比棧頂操作符優先順序高*/  
    && (ch == '*' || ch == '/'))
    {  
        return 0;                      /*操作符壓入棧*/   
    }   
    else if(*top_oper == -1 || ch == '('|| (oper[*top_oper] == '(' && ch != ')'))  /*判斷操作符棧是否為空;棧頂操作   符是否為'('*/  
    {  
return 0;                       /*操作符壓入棧*/  
    }  
    else if (oper[*top_oper] =='(' && ch == ')' )       /*判斷括號內的表示式是否計算完畢*/  
    {  
(*top_oper)--;  
return 1;                       /*對()進行處理*/  
    }  
    else  
    {  
        return -1;                                          /*進行操作符的運算*/  
    }  
}  


int deal_date(int *operand ,char *oper ,int *top_num, int *top_oper)    /*進行資料運算*/  
{  
    int num_1 = operand[*top_num];              /*取出資料棧中兩個資料*/  
    int num_2 = operand[*top_num - 1];  
    
    int value = 0;  
    
    if(oper[*top_oper] == '+')                  /*加法操作*/  
    {  
value = num_1 + num_2;  
    }  
    
    else if(oper[*top_oper] == '-')             /*減法操作*/  
    {  
value = num_2 - num_1;  
    }  
    
    else if(oper[*top_oper] == '*')             /*乘法操作*/  
    { 
        value = num_2 * num_1;  
    }  
    
    else if(oper[*top_oper] == '/')             /*除法操作*/  
    {  
value = num_2 / num_1;  
    }  
    
    (*top_num) --;                              /*將資料棧頂下移一位*/  
    operand[*top_num] = value;                  /*將得到的值壓入資料棧*/  
    (*top_oper) --;                             /*將操作符棧頂下移一位*/  
}  


int main()  
{  
    int operand[MAX_SIZE] = {0};                /*資料棧,初始化*/  
    int  top_num = -1;  
    
    char oper[MAX_SIZE] = {0};                  /*操作符棧,初始化*/  
    int top_oper = -1;  
    char *str = (char *) malloc (sizeof(char) * 100);               /*獲取表示式(不帶=)*/  
    
    scanf("%s",str);  
    char* temp;  
    char dest[MAX_SIZE];  
    
    int num = 0;  
    int i = 0;  
    
    while(*str != '\0')  
    {  
temp = dest;  
while(*str >= '0' && *str <= '9')           /*判斷是否是資料*/  
        {  
   *temp = *str;  
   str ++;  
   temp ++;                  
}                               /*遇到符號退出*/  
       
        if(*str != '(' && *(temp - 1) != '\0')      /*判斷符號是否為'('*/  
{  
   *temp = '\0';  
   num = atoi(dest);               /*將字串轉為數字*/  
   insert_operand(operand, &top_num,num);      /*將資料壓入資料棧*/  
}  

while(1)  
{  
   i = compare(oper,&top_oper,*str);      /*判斷操作符優先順序*/  
   if(i == 0)  
   {  
       insert_oper(oper,&top_oper,*str);   /*壓入操作符*/  
       break;  
   }  
   
   else if(i == 1)                         /*判斷括號內的表示式是否結束*/  
   {  
str++;
   }  
   
   else if(i == -1)                        /*進行資料處理*/  
   {  
deal_date(operand,oper,&top_num,&top_oper);  
   }  
}  
        str ++;                 /*指向表示式下一個字元*/  
    }  
    
    printf("num = %d\n",operand[0]);        /*輸出結果*/  
    return 0;                       /*正常退出*/