超级计算器
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
您的计算器似乎输入只支持个位数
2025-08-31 来自 浙江
0是否应该在判断数字的时候一次性把数字全部读入并处理成多位数
2025-08-31 来自 浙江
0是的,但是如何修改?
2025-08-31 来自 江苏
0还有,我不是dalao,我比那两个儿子差多了

2025-08-31 来自 浙江
0
括号有啥问题
2025-08-31 来自 广东
0输入后显示运行错误
2025-08-31 来自 江苏
0例如输入“(3+5)*2”
2025-08-31 来自 江苏
0查出来了,第 24 行的
nsk.empty()||删了就行了2025-08-31 来自 广东
0




















有帮助,赞一个