带括号的表达式计算

一、表达式形式

形如(3*(2+5)),每个运算符之间都有括号相隔

二、问题

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

三、思路

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

2.遍历字符串

2.1遍历遇到‘(’不处理

2.2遍历到数字,将数字储存到数字栈中

2.3遍历到运算符,将运算符储存到运算符栈中

2.4遍历到‘)’,从数字栈中取出两个数,从运算符中取出栈顶的运算符,

2.5计算两个数和运算符计算后的结果,将计算结果储存到数字栈中

3.当遍历结束时,数字栈中的栈顶元素即为表达式结果

过程示例:

代码:

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;
	}
}
void calculator(const string &s)
{
	stack<char> opt;
	stack<int> num;
	char ch;
	for (int i = 0; i < s.length();)
	{
		ch = s[i];
		if (ch >= '0'&& ch <= '9')
		{
			int number = 0;
			while (ch >= '0'&&ch <= '9')
			{
				number = number * 10 + ch - '0';
				ch = s[++i];
			}
			num.push(number);
		}
		else if (ch == '(') { i++; }
		else if (ch == ')')
		{
			i++;
			int num2 = num.top(); //注意弹出数的顺序
			num.pop();
			int num1 = num.top();
			num.pop();
			char op = opt.top();
			opt.pop();
			int temnum = cal(num1, num2, op);
			num.push(temnum);
		}
		else
		{
			i++;
			opt.push(ch);
		}

	}
	cout << "计算结果:";
	cout << num.top();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值