表达式求值

本文介绍了一个使用C++实现的逆波兰表达式计算器,能够处理包含加、减、乘、除运算的数学表达式,利用栈数据结构进行优先级处理和计算。
#include <iostream>
  #include <algorithm>
  #include <cstring>
  #include <cstdio>
  #include <cmath>
  #include <stack>

 using namespace std;
 const int MAXN = 1010;
 
 int priority(char c) // 表达优先级的大小关系
 {
     if (c == '*' || c == '/') return 2;
    if (c == '+' || c == '-') return 1;
     return 0;
 }
 
 void cal(stack<char> &my_op, stack<double> &my_num) // 将数字栈与操作栈通过引用的形式实现调用与更改
 {
     double b = my_num.top();
     my_num.pop();
     double a = my_num.top();
     my_num.pop();
    switch(my_op.top())
     {
     case '+':
        my_num.push(a + b);
         break;
     case '-':
         my_num.push(a - b);
         break;
     case '*':
         my_num.push(a * b);
         break;
     case '/':
         my_num.push(a / b);
         break;
     }
     my_op.pop();
 }
 
 int main()
 {
 
     int t;
     scanf("%d", &t);
     while(t --)
     {
         char s[MAXN];
         scanf("%s", s);
         int len = strlen(s);
         stack <double> my_num;
         stack <char> my_op;
 
         for(int i = 0; i < len; ++ i)
         {
             if(isdigit(s[i]))      //如果s[i]是数字,不是符号 
             {
                 double temp = atof(&s[i]);     //字符串转化为浮点数 
                 while(isdigit(s[i]) || s[i] == '.') ++ i;
                 my_num.push(temp);
                 -- i;
             }
             else if(s[i] == '(')
             {
                 my_op.push(s[i]);
             }
             else if(s[i] == ')')
             {
                while(my_op.top() != '(')
                     cal(my_op, my_num);
                 my_op.pop();
             }
             else if(my_op.empty())
             {
                 my_op.push(s[i]);
             }
             else if(priority(my_op.top()) < priority(s[i]))
             {
                 my_op.push(s[i]);
				              }
             else if(priority(my_op.top()) >= priority(s[i]))
            {
                 while(!my_op.empty() && priority(my_op.top()) >= priority(s[i])) // 比较的是优先级关系不是ASCⅡ,
                     cal(my_op, my_num);
                 my_op.push(s[i]);
				              }
        }
         my_op.pop();
         printf("%.2lf\n", my_num.top());
        my_num.pop();
     }
     return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值