超级计算器
2025-08-31 20:38:41
发布于:江苏
今天我突发奇想,能不能编写一个计算器,支持各种运算?可惜工程量巨大及本蒟蒻能力有限,我才写到普通计算,希望能找一些大佬帮忙
现阶段成果
/*特别鸣谢:
1.cjdst 解决了括号问题
2.ppl 可以进行多位数运算
*/
#include<bits/stdc++.h>
using namespace std;
string a;
string qz;
int ysj(char s) {
if (s == '+' || s == '-')
return 1;
else if (s == '*' || s == '/')
return 2;
else return 0;
}
double value(double op1, double op2, char ch) {
switch (ch) {
case '+':
return op1 + op2;
break;
case '-':
return op1 - op2;
break;
case '*':
return op1 * op2;
break;
case '/':
return op1 / op2;
break;
}
}
double get(int &i, string str) {
int res = 0;
while (str[i] != '\0' && isdigit(str[i])) {
res = res * 10 + str[i] - '0';
i++;
}
i--;
return res;
}
double pt(string str) {
stack<double> nsk;
stack<char> ssk;
for (int i = 0; str[i] != '\0'; ++i) {
if (isdigit(str[i])) {
double num = get(i, str);
nsk.push(num);
} else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') {
if (ssk.empty() || ysj(str[i]) > ysj(ssk.top()))
ssk.push(str[i]);
else {
while (!ssk.empty() && ysj(ssk.top()) >= ysj(str[i])) {
double op2 = nsk.top();
nsk.pop();
double op1 = nsk.top();
nsk.pop();
nsk.push(value(op1, op2, ssk.top()));
ssk.pop();
}
ssk.push(str[i]);
}
} else {
if (str[i] == '(')
ssk.push(str[i]);
else if (str[i] == ')') {
while (!ssk.empty() && ssk.top() != '(') {
double op2 = nsk.top();
nsk.pop();
double op1 = nsk.top();
nsk.pop();
nsk.push(value(op1, op2, ssk.top()));
ssk.pop();
}
if (!ssk.empty() && ssk.top() == '(')
ssk.pop();
}
}
}
while (!ssk.empty()) {
double op2 = nsk.top();
nsk.pop();
double op1 = nsk.top();
nsk.pop();
nsk.push(value(op1, op2, ssk.top()));
ssk.pop();
}
return nsk.top();
}
int main() {
cin >> a;
double zhjg = pt(a);
cout << zhjg;
return 0;
}
随便@几位大佬来支援一下
@dream_陆军展览(不加团队)
@复仇者_帅童
@AAA混泥土批发ppl哥
全部评论 2
您的计算器似乎输入只支持个位数
5天前 来自 浙江
0是否应该在判断数字的时候一次性把数字全部读入并处理成多位数
5天前 来自 浙江
0是的,但是如何修改?
5天前 来自 江苏
0还有,我不是dalao,我比那两个儿子差多了
5天前 来自 浙江
0
括号有啥问题
5天前 来自 广东
0输入后显示运行错误
5天前 来自 江苏
0例如输入“(3+5)*2”
5天前 来自 江苏
0查出来了,第 24 行的
nsk.empty()||
删了就行了5天前 来自 广东
0
有帮助,赞一个