山东大学数据结构实验六

计算表达式

tips:不要全文复制,会被查重哦

注意

因为精度问题,请使用double存数据。

要求

  1. 创建栈类,采用数组描述;
  2. 计算数学表达式的值。
    输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符+-*/() 构成,例如 2+3*(4+5)-6/4。假定表达式输入格式合法。

格式

输入

第一行一个整数n(1<=n<=100),代表表达式的个数。
接下来n行,每行一个表达式,保证表达式内的数字为单个整数,表达式内各运算符和数字间没有空格,且表达式的长度不超过2000。

输出

每行表达式输出一个浮点数,要求保留两位小数,保证输入表达式合法。

样例

输入

3
1+6/1*7+2*1*4+9/1+2*0*9+9+7/(9*5)-1*6-0*8-7-9*2+6-(0-5-2*8-7-9*5*(6-5*5*2*6-2-7-5+6*7+6*9-1*0*0+3*0+2/1-6/6+5))
0-4-1/6*(1-(6/7)-4+6+2+6*1)-1*7+2-8*2+0-(4+6-6*1+(3-8*6/4-6-5)*6/4/8+7-1*4/9*5)-0/6+1-0-2+7-2+6*4-3*6+2/8+6+1*6*2
5-3*9+5/1*5-9+1*8-6-8-4*1+5-2+9/3*2-2/5/(2-6)*2/7-9*0-2+4/6*6*7*8-8-8*6+8*9*(3+0*1/5/2*7*8+0-8*8-5+8/5*2-0)

输出

-9197.84
-3.47
-4362.57

限制

1s, 65536KiB for each test case.

#include<iostream>
#include <string>
#include <stdio.h>
#include <cstdio>
#include <iomanip>


using namespace std;

const int N = 2010;

template<class T>
class stack {
public:
    stack() {
        stackTop = -1;
        element = new T[N];
    }

    bool isEmpty() { return stackTop == -1; }

    ~stack() { delete[]element; }

    int size() { return stackTop + 1; }

    T &top();

    void pop();

    void push(const T &theElement);

private:
    T *element;
    int stackTop;
};

template<class T>
T &stack<T>::top() {
    return element[stackTop];
}

template<class T>
void stack<T>::pop() {
    stackTop--;
}

template<class T>
void stack<T>::push(const T &theElement) {
//在栈顶插入元素
    element[++stackTop] = theElement;
}


void calculate(stack<double> &number, stack<char> &operate) {
    auto a = number.top();
    number.pop();
    auto b = number.top();
    number.pop();
    auto c = operate.top();
    switch (c) {
        case '+': {
            number.push((double) (b + a));
            break;
        }
        case '-': {
            number.push((double) (b - a));
            break;
        }
        case '*': {
            number.push((double) (a * b));
            break;
        }
        case '/': {
            number.push((double) (b / a));
            break;
        }
    }
    operate.pop();
}

int priorityop(char a, char b)//判断a的优先级是否比b高或者相等
{
    if (a == '+' && b == '+')return 1;
    else if (a == '+' && b == '-')return 1;
    else if (a == '+' && b == '*')return 0;
    else if (a == '+' && b == '/')return 0;
    else if (a == '-' && b == '-')return 1;
    else if (a == '-' && b == '+')return 1;
    else if (a == '-' && b == '*')return 0;
    else if (a == '-' && b == '/')return 0;
    else if (a == '*' && b == '*')return 1;
    else if (a == '*' && b == '/')return 1;
    else if (a == '*' && b == '+')return 1;
    else if (a == '*' && b == '-')return 1;
    else if (a == '/' && b == '*')return 1;
    else if (a == '/' && b == '/')return 1;
    else if (a == '/' && b == '+')return 1;
    else if (a == '/' && b == '-')return 1;

}


int main() {

    double n;
    cin >> n;

    while (n--) {
        string str;
        cin >> str;
        int len = str.length();
        stack<double> number;
        stack<char> operate;
        for (int i = 0; i < len; ++i) {
            if (str[i] - '0' >= 0 && str[i] - '0' <= 9) {
                int x = 0, j = i;
                while (j < len && str[j] - '0' >= 0 && str[j] - '0' <= 9)
                    x = x * 10 + str[j++] - '0';
                i = j - 1;
                number.push((double) x);

            } else if (str[i] == '(') operate.push(str[i]);
            else if (str[i] == ')') {
                while (operate.top() != '(') calculate(number, operate);
                operate.pop();
            } else {
                while (operate.size() && operate.top() != '(' && priorityop(operate.top(), str[i]))
                    calculate(number, operate);
                operate.push(str[i]);

            }
        }
        while (operate.size()) calculate(number, operate);
        double res = number.top();
        printf("%.2lf\n",res);
    }


    return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕噜咕噜咕噜128

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值