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;                       /*正常退出*/  
  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的C语言程序实现计算器功能: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_EXPR_LEN 100 // 定义运算符栈结构体 typedef struct { char data[MAX_EXPR_LEN]; int top; } OperatorStack; // 定义操作数栈结构体 typedef struct { double data[MAX_EXPR_LEN]; int top; } OperandStack; // 初始化运算符栈 void initOperatorStack(OperatorStack *stack) { stack->top = -1; } // 初始化操作数栈 void initOperandStack(OperandStack *stack) { stack->top = -1; } // 判断是否为数字 int isNumber(char c) { return isdigit(c) || c == '.'; } // 判断是否为运算符 int isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '(' || c == ')'; } // 获取运算符优先级 int getPriority(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': case '%': return 2; default: return 0; } } // 将中缀表达式转换为后缀表达式 void infixToPostfix(char *infixExpr, char *postfixExpr) { OperatorStack operatorStack; initOperatorStack(&operatorStack); int i = 0, j = 0; while (infixExpr[i]) { if (isNumber(infixExpr[i])) { while (isNumber(infixExpr[i])) { postfixExpr[j++] = infixExpr[i++]; } postfixExpr[j++] = ' '; } else if (isOperator(infixExpr[i])) { if (infixExpr[i] == '(') { operatorStack.data[++operatorStack.top] = infixExpr[i++]; } else if (infixExpr[i] == ')') { while (operatorStack.data[operatorStack.top] != '(') { postfixExpr[j++] = operatorStack.data[operatorStack.top--]; postfixExpr[j++] = ' '; } operatorStack.top--; i++; } else { while (operatorStack.top != -1 && operatorStack.data[operatorStack.top] != '(' && getPriority(operatorStack.data[operatorStack.top]) >= getPriority(infixExpr[i])) { postfixExpr[j++] = operatorStack.data[operatorStack.top--]; postfixExpr[j++] = ' '; } operatorStack.data[++operatorStack.top] = infixExpr[i++]; } } else { printf("Invalid character: %c\n", infixExpr[i]); exit(1); } } while (operatorStack.top != -1) { postfixExpr[j++] = operatorStack.data[operatorStack.top--]; postfixExpr[j++] = ' '; } postfixExpr[j] = '\0'; } // 计算后缀表达式 double calculatePostfix(char *postfixExpr) { OperandStack operandStack; initOperandStack(&operandStack); int i = 0; while (postfixExpr[i]) { if (isNumber(postfixExpr[i])) { char *start = postfixExpr + i; while (isNumber(postfixExpr[i])) { i++; } double num = atof(start); operandStack.data[++operandStack.top] = num; } else if (isOperator(postfixExpr[i])) { double b = operandStack.data[operandStack.top--]; double a = operandStack.data[operandStack.top--]; switch (postfixExpr[i]) { case '+': operandStack.data[++operandStack.top] = a + b; break; case '-': operandStack.data[++operandStack.top] = a - b; break; case '*': operandStack.data[++operandStack.top] = a * b; break; case '/': operandStack.data[++operandStack.top] = a / b; break; case '%': operandStack.data[++operandStack.top] = (int)a % (int)b; break; } i++; } else { printf("Invalid character: %c\n", postfixExpr[i]); exit(1); } } return operandStack.data[operandStack.top]; } int main() { char infixExpr[MAX_EXPR_LEN], postfixExpr[MAX_EXPR_LEN]; printf("Enter the infix expression: "); fgets(infixExpr, MAX_EXPR_LEN, stdin); infixToPostfix(infixExpr, postfixExpr); printf("The postfix expression is: %s\n", postfixExpr); printf("The result is: %lf\n", calculatePostfix(postfixExpr)); return 0; } ``` 使用方法:在终端中运行程序,输入中缀表达式,程序将自动计算并输出结果。例如,输入`(2.5+3)*4-5%2`,程序将输出: ``` Enter the infix expression: (2.5+3)*4-5%2 The postfix expression is: 2.5 3 + 4 * 5 2 % - The result is: 16.000000 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值