山东大学数据结构实验六
Posted lyz103
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了山东大学数据结构实验六相关的知识,希望对你有一定的参考价值。
计算表达式
tips:不要全文复制,会被查重哦
注意
因为精度问题,请使用double存数据。
要求
- 创建栈类,采用数组描述;
- 计算数学表达式的值。
输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符+
、-
、*
、/
、(
、)
构成,例如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;
大学物理实验报告六 -- 示波器的使用
个人作业,仅供参考
以上是关于山东大学数据结构实验六的主要内容,如果未能解决你的问题,请参考以下文章