C语言栈实现表达式计算器

栈实现计算器

黑色印记

前段时间利用栈写了一个实现了计算器功能的程序。觉得有意思的,因此今天在这了和大家分享一番。

首先,要写出计算器,你要按照以下几点去写,才能保证运算的优先级不发生错误。

1.自左向右扫描表达式,凡是遇到操作数一律进操作数栈。

2.当遇到运算符时,如果他的优先级比运算符栈栈顶元素的优先级高就栈。反之,取出栈顶运算符和操作数栈顶的两个连续操作数运算,并将结果存入操作数栈,然后继续比较该运算符与栈顶的运算符的优先级。

3.左括号一律进运算符栈,右括号一律不进运算符栈,取出栈顶运算符和操作数栈顶的两个连续操作数运算,并将结果存入操作数栈,直到取出左括号为止。

希望大家可以自己独立完成。因为这个是有难度的,可以写在自己以后简历上。


附上我写的程序,可供大家参考。


[html]  view plain  copy
  1. /*****************************************************  
  2. File name:calculator  
  3. Author:谢艺化    Version:1.0    Date: 2016-6-12  
  4. Description:可以作为简单的计算器,实现加,减,乘,除,以及带括号的运草  
  5. Calls : 1.insert_operand ()     输入数据  
  6.         2.insert_oper()         输入操作符  
  7.         3.compare()             比较操作符优先级  
  8.         4.deal_date()           进行数据处理  
  9. *****************************************************/  
  10.   
  11. #include <stdio.h>                          /*包含头文件*/  
  12. #define MAX_SIZE 1024                       /*数组长度*/  
  13.   
  14. int insert_operand(int *operand , int * top_num ,int num)           /*数据压入数据栈*/  
  15. {  
  16.     (*top_num) ++;  
  17.     operand[*top_num] = num;                    /*保存数据*/  
  18.       
  19.     return 0;                           /*正常退出*/  
  20. }  
  21.   
  22. int insert_oper (char * oper , int *top_oper , char ch)             /*操作符压入符号栈*/  
  23. {  
  24.     (*top_oper)++;  
  25.     oper[*top_oper] = ch;                       /*保存操作符*/  
  26.   
  27.     return 0;                           /*正常退出*/  
  28. }  
  29.   
  30. int compare(char *oper , int *top_oper , char ch)                   /*比较操作服优先级*/  
  31. {     
  32.      
  33.     if((oper[*top_oper] == '-' || oper[*top_oper] == '+')           /*判断当前优先级是否比栈顶操作符优先级高*/  
  34.             && (ch == '*' || ch == '/'))  
  35.     {  
  36.         return 0;                      /*操作符压入栈*/   
  37.     }  
  38.   
  39.     else if(*top_oper == -1 || ch == '('   
  40.             || (oper[*top_oper] == '(' && ch != ')'))       /*判断操作符栈是否为空;栈顶操作                                                               符是否为'('*/  
  41.     {  
  42.         return 0;                       /*操作符压入栈*/  
  43.     }  
  44.   
  45.     else if (oper[*top_oper] =='(' && ch == ')' )       /*判断括号内的表达式是否计算完毕*/  
  46.     {  
  47.         (*top_oper)--;  
  48.         return 1;                       /*对()进行处理*/  
  49.     }  
  50.   
  51.     else  
  52.     {  
  53.         return -1;                                          /*进行操作符的运算*/  
  54.     }  
  55.   
  56. }  
  57.   
  58. int deal_date(int *operand ,char *oper ,int *top_num, int *top_oper)    /*进行数据运算*/  
  59. {  
  60.     int num_1 = operand[*top_num];              /*取出数据栈中两个数据*/  
  61.     int num_2 = operand[*top_num - 1];  
  62.   
  63.     int value = 0;  
  64.   
  65.     if(oper[*top_oper] == '+')                  /*加法操作*/  
  66.     {  
  67.         value = num_1 + num_2;  
  68.     }  
  69.   
  70.     else if(oper[*top_oper] == '-')             /*减法操作*/  
  71.     {  
  72.         value = num_2 - num_1;  
  73.     }  
  74.   
  75.     else if(oper[*top_oper] == '*')             /*乘法操作*/  
  76.     {  
  77.         value = num_2 * num_1;  
  78.     }  
  79.   
  80.     else if(oper[*top_oper] == '/')             /*除法操作*/  
  81.     {  
  82.         value = num_2 / num_1;  
  83.     }  
  84.   
  85.     (*top_num) --;                              /*将数据栈顶下移一位*/  
  86.     operand[*top_num] = value;                  /*将得到的值压入数据栈*/  
  87.     (*top_oper) --;                             /*将操作符栈顶下移一位*/  
  88.   
  89.   
  90. }  
  91.   
  92. int main()  
  93. {  
  94.     int operand[MAX_SIZE] = {0};                /*数据栈,初始化*/  
  95.     int  top_num = -1;  
  96.   
  97.     char oper[MAX_SIZE] = {0};                  /*操作符栈,初始化*/  
  98.     int top_oper = -1;  
  99.   
  100.     char *str = (char *) malloc (sizeof(char) * 100);               /*获取表达式(不带=)*/  
  101.     scanf("%s",str);  
  102.   
  103.     char* temp;  
  104.     char dest[MAX_SIZE];  
  105.     int num = 0;  
  106.   
  107.     int i = 0;  
  108.     while(*str != '\0')  
  109.     {  
  110.         temp = dest;  
  111.   
  112.         while(*str >= '0' && *str <= '9')           /*判断是否是数据*/  
  113.         {  
  114.             *temp = *str;  
  115.             str ++;  
  116.             temp ++;                  
  117.         }                               /*遇到符号退出*/  
  118.   
  119.         if(*str != '(' && *(temp - 1) != '\0')      /*判断符号是否为'('*/  
  120.         {  
  121.             *temp = '\0';  
  122.   
  123.             num = atoi(dest);               /*将字符串转为数字*/  
  124.             insert_operand(operand, &top_num,num);      /*将数据压入数据栈*/  
  125.         }  
  126.   
  127.          while(1)  
  128.          {  
  129.              i = compare(oper,&top_oper,*str);      /*判断操作符优先级*/  
  130.   
  131.             if(i == 0)  
  132.             {  
  133.                 insert_oper(oper,&top_oper,*str);   /*压入操作符*/  
  134.                 break;  
  135.             }  
  136.   
  137.             else if(i == 1)                         /*判断括号内的表达式是否结束*/  
  138.             {  
  139.                 str++;  
  140.             }  
  141.   
  142.             else if(i == -1)                        /*进行数据处理*/  
  143.             {  
  144.                 deal_date(operand,oper,&top_num,&top_oper);  
  145.             }  
  146.   
  147.          }  
  148.   
  149.         str ++;                 /*指向表达式下一个字符*/  
  150.     }  
  151.   
  152.     printf("num = %d\n",operand[0]);        /*输出结果*/  
  153.   
  154.     return 0;                       /*正常退出*/  
  155. }  

扫描二维码关注公众号,回复: 2387186 查看本文章

猜你喜欢

转载自blog.csdn.net/zwt0112/article/details/54562469