C++实现简单计算器

基于C++STL的计算器实现

实现一个简单的计算器,支持运算符:+ , - , * , / , ( )

完整代码:

#include <iostream>
#include <vector>
#define max 100
using namespace std;
//操作符优先级设置
int getprior(char x)
{
	if (x == '#') return 0;
	if (x == '+' || x == '-') return 1;
	if (x == '*' || x == '/') return 2;
	if (x == '(' || x == ')') return 3;
}
int sign = 0;//标记开头是否为负数
//优先级比较
int compare(char x, char j)
{
	if (j < 48)
	{
		if (getprior(x) > getprior(j) && x == '(') return 1;//“(”括号特殊处理
		if (getprior(x) > getprior(j)) return 0;//栈内优先级高
		if (x == '#' && j == '-') //开头负号处理
		{
			if (sign == 0) return 4;
			else return 1;
		}
		if (getprior(x) < getprior(j) && j == ')') return 0;//“)”括号处理
		if (getprior(x) < getprior(j)) return 1;//栈内优先级低
		if (getprior(x) == getprior(j) && j == '#') return 2;//删号
		if (getprior(x) == getprior(j) && j == ')') return 2;//删号
		if (getprior(x) == getprior(j)) return 0;//优先级相同但顺序不同
	}
	else return 3;//数字
}

int main()
{
	//输入字符串
	char cun[max] = { '0' };
	char x1 = '#';
	int n = 0;
	while (true)//输入停止符
	{
		cin >> x1;
		cun[n] = x1;
		n++;
		if (x1 == '=') break;
	}
	if (cun[n - 1] == 61) cun[n - 1] = cun[n - 1] - 26;
	vector<int> num;
	vector<char> opt;
	opt.push_back('#');
	for (int i = 0; i < n; i++)
	{
		char c = opt.back();//暂存原来符号栈中的符号
		char t = cun[i];
		int k = compare(c, t);
		if (k == 1)//栈内优先级低输入
		{
			opt.push_back(t);
		}
		if (k == 0)//栈内优先级高计算
		{
			int temp01 = num.back();
			num.pop_back();
			int temp02 = num.back();
			num.pop_back();
			switch (c)
			{
			case '+':
				num.push_back(temp01 + temp02);
				break;
			case '-':
				num.push_back(temp02 - temp01);
				break;
			case '*':
				num.push_back(temp01 * temp02);
				break;
			case '/':
				num.push_back(temp02 / temp01);
				break;
			}
			opt.pop_back();//清除使用过的符号
			i--;
			continue;
		}
		if (k == 2)//相同符号执行删除两次
		{
			opt.pop_back();
		}
		if (k == 3)//多位数设置+char型数据转化为int型
		{
			int p = cun[i] - '0';
			int sum = p;
			while(cun[i + 1] >= 48)
			{
				int q = cun[i + 1] - '0';
				sum = sum * 10 + q;
				i++;
			}
			if (sign == 1) sum = -sum;
			num.push_back(sum);
			sign = 2;//变为2
		}
		if (k == 4) sign = 1;//标记为负数
	}
	cout << num.back();
	num.clear();

	return 0;
}

//测试数据
//  45-(34-4)*2   4-(1-1)  -45/(9-4)

运行展示:

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值