山东大学数据结构实验六

Posted lyz103

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了山东大学数据结构实验六相关的知识,希望对你有一定的参考价值。

计算表达式

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;

大学物理实验报告六 -- 示波器的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

个人作业,仅供参考

以上是关于山东大学数据结构实验六的主要内容,如果未能解决你的问题,请参考以下文章

大学物理实验报告六 -- 示波器的使用

大学物理实验报告六 -- 示波器的使用

大学计算机相关专业实验实训整理

大学计算机相关专业实验实训整理

实验六 进程基础

java实验六(继承接口异常相关知识点)