编程题-计算表达式

给一个带 加减乘除符号、小数、不包含括号 的表达式,求值

利用双栈模拟后缀表达式计算

#include <string>
#include <stack>
#include <stdlib.h>
#include<iostream>
using namespace std;

bool priorCompare(char a, char b) {
	if (a == '\0') return false;
	if (a == '*' || a == '/') {
		if (b == '*' || b == '/') return false;
		else return true;
	}
	return false;
}

double getCalc(double a, double b, char sign) {
	if (sign == '*')return a * b;
	else if (sign == '/') return a / b;
	else if (sign == '+') return a + b;
	else return a - b;
}

double compute(string input) {
	stack<char> sign;
	stack<double> result;
	string digits = "";
	// 注意这里是字符长度+1的循环,用于处理收尾数字,不能写成增强for
	for (int i = 0; i <= input.size();i++) {
		char ch = input[i];
		if (isdigit(ch) || ch == '.') digits += ch;
		else {
			result.push(atof(digits.c_str()));
			digits = "";
			// 如果当前运算符优先级低于栈顶元素则计算,并压栈,循环直到当前运算符优先级大于栈顶
			while (!sign.empty() && !priorCompare(ch, sign.top())) {
				double b = result.top();
				result.pop();
				double a = result.top();
				result.pop();
				result.push(getCalc(a, b, sign.top()));
				sign.pop();
			}
			sign.push(ch);
		}
	}
	return result.top();
}

int main() {
	cout << compute("1.5+3*4/2") << endl;
	cout << compute("1.5+3*4+4/2-1") << endl;
}
posted @ 2023-03-12 11:39  YaosGHC  阅读(22)  评论(0)    收藏  举报