计算表达式
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;
}
标签:return,number,else,实验,&&,数据结构,山东大学,stack,表达式
From: https://www.cnblogs.com/lyz103/p/17353844.html