不带括号的表达式计算

一、表达式形式

2*3+6/3+5

二、问题

假设一中的表达式是一段程序可读的字符串,如何计算表达式的值

三、思路

1.创建两个栈,分别为数字栈、和运算符栈

2.遍历字符串

3.当遇到数字将数字存储到数字栈中

4.当遇到运算符时,比较运算符栈顶元素和当前运算符的优先级

4.1若当前元素大于栈顶元素,将当前元素压入运算符栈

4.2若当前元素小于等于栈顶元素,将栈顶元素弹出

4.2.1将数字栈中的前两个元素弹出与运算符栈弹出的元素计算结果

4.2.2将计算结果保存到数字栈中

5.遍历结束后,重复4步骤直到运算符栈没有运算符

6.最后表达式的结果为栈顶元素

代码:

//比较运算符优先级
int cmp(const char a, const char b)
{
	if (pri[a] >= pri[b]) return 1;
	else if (pri[a] < pri[b]) return 0;
}
int cal(int a, int b, const char op)
{
	switch (op)
	{
	case('+'):
		return a + b;
	case('-'):
		return a - b;
	case('*'):
		return a * b;
	case('/'):
		return a / b;
	default:
		break;
	}
/**
 *应为表达式没有括号
 *所以要考虑运算符的优先级
 *将优先级储存在map中,并在cmp函数中比较
 *当将要入栈的运算符的优先级小于或等于则计算
 *栈顶元素相邻数字的结果
 */
void calculator2(const string &s)
{
	//利用map储存运算符的优先级
	pri['$'] = -1;
	pri['+'] = 1;
	pri['-'] = 1;
	pri['*'] = 2;
	pri['/'] = 2;

	stack<char> op;
	stack<int> num;
	op.push('$');
	char ch;
	for (int i = 0; i < s.length();)
	{
		ch = s[i];
		if (ch <= '9' && ch >= '0')
		{
			int number = 0;
			while (ch >= '0'&&ch <= '9')
			{
				number = number * 10 + ch - '0';
				ch = s[++i];
			}
			num.push(number);
		}
		else if (cmp(op.top(), ch)==0)
		{
			op.push(ch);
			i++;
		}
		else {
			int num1, num2, op1;
			num1 = num.top();
			num.pop();
			num2 = num.top();
			num.pop();
			op1 = op.top();
			op.pop();
			int temp = cal(num2,num1,op1);
			num.push(temp);
		}
	}
	while (op.top()!='$')
	{
		int num1, num2, op1;
		num1 = num.top();
		num.pop();
		num2 = num.top();
		num.pop();
		op1 = op.top();
		op.pop();
		int temp = cal(num2, num1, op1);
		num.push(temp);
	}
	cout << "计算结果:";
	cout << num.top();
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值