中缀表达式计算器

#include <iostream>
#include <stack>
#include <vector>
#include <cstdlib>
using namespace std;

enum Operator {ERROR, NUM, PLUS, MINUS, DIV, MULTIPLY, SHOW, lBracket, rBracket};
struct Element
{
	double operand;
	Operator _operator;
};

Operator charToOperator(char ch)
{
    switch (ch)
    {
    case '+':
        return PLUS;
    case '-':
        return MINUS;
    case '*':
        return MULTIPLY;
    case '/':
        return DIV;
    case '=':
        return SHOW;
    case '(':
        return lBracket;
    case ')':
        return rBracket;
    default:
        return ERROR;
    }
}

bool solve(vector <Element> elements, double &result)
{
	stack <double> nums;
	double rhs, lhs, temp;
	for (unsigned int i = 0; i < elements.size(); i++)
	{
		if (elements[i]._operator == NUM)
			nums.push(elements[i].operand);
		else if (elements[i]._operator != SHOW)
		{
			if (nums.size() < 2)
				return false;
			rhs = nums.top();
			nums.pop();
			lhs = nums.top();
			nums.pop();
			switch (elements[i]._operator)
			{
			case PLUS:
				temp = lhs + rhs;
				break;
			case MINUS:
				temp = lhs - rhs;
				break;
			case MULTIPLY:
				temp = lhs * rhs;
				break;
			case DIV:
				if (rhs == 0)
				{
					cout << "错误:除数不能为0!" << endl;
					return false;
				}
				temp = lhs / rhs;
				break;
			}
			nums.push(temp);
		}
		else
		{
			if (nums.empty())
				cout << "当前栈是空的!" << endl;
			else
				cout << "当前栈顶元素:" << nums.top() << endl;
		}
	}
	if (nums.size() != 1)
		return false;
	result = nums.top();
	return true;
}

void addAll(vector <Element> &elements, stack <Operator> &operators)
{
    Element element;
    while (!operators.empty() && (element._operator = operators.top()) != lBracket)
    {
        operators.pop();
        elements.push_back(element);
    }
}

bool infix(char *expression, double &result)
{
	char *p = expression;
	char digits[10];
	char *p2 = digits, temp;
	vector <Element> elements;
	stack <Operator> operators;
	Element element;
	Operator op;
	while (*p)
	{
		if (('0' <= *p && *p <= '9') || *p == '.')
		{
			*p2++ = *p;
		}
		else
		{
			if (p2 != digits)
			{
				*p2 = '\0';
				element._operator = NUM;
				element.operand = atof(digits);
				elements.push_back(element);
				p2 = digits;
			}
			switch (op = charToOperator(*p))
			{
			case PLUS:
			case MINUS:
			    addAll(elements, operators);
				operators.push(op);
				break;
			case MULTIPLY:
			case DIV:
                if (!operators.empty() && (operators.top() == MULTIPLY ||
                operators.top() == DIV) && operators.top() != lBracket)
                {
                    element._operator = operators.top();
                    operators.pop();
                    elements.push_back(element);
                }
                operators.push(op);
			    break;
			case lBracket:
				operators.push(lBracket);
				break;
			case rBracket:
                addAll(elements, operators);
                if (operators.empty() || operators.top() != lBracket)
                    return false;
                else
                {
                    operators.pop();
                }
				break;
            case ERROR:
                return false;
			}
		}
		p++;
	}
	if (p2 != digits)
	{
		*p2 = '\0';
		element._operator = NUM;
		element.operand = atof(digits);
		elements.push_back(element);
		p2 = digits;
	}
    addAll(elements, operators);
	cout << "后缀表达式:";
	for (unsigned int i = 0; i < elements.size(); i++)
	{
		switch (elements[i]._operator)
		{
		case NUM:
			cout << elements[i].operand << " ";
			break;
		case PLUS:
			cout << "+ ";
			break;
		case MINUS:
			cout << "- ";
			break;
		case MULTIPLY:
			cout << "* ";
			break;
		case DIV:
			cout << "/ ";
			break;
		case SHOW:
			cout << "= ";
			break;
		}
	}
	cout << endl;
	return solve(elements, result);
}

bool suffix_q(char *expression, double &result)
{
	char *p = expression;
	char digits[10];
	char *p2 = digits;
	vector <Element> elements;
	Element element;
	while (*p)
	{
		if ((*p >= '0' && *p <= '9') || *p == '.')
		{
			*p2++ = *p;
		}
		else
		{
			if (p2 != digits)
			{
				*p2 = '\0';
				element._operator = NUM;
				element.operand = atof(digits);
				elements.push_back(element);
				p2 = digits;
			}
			switch (*p)
			{
			case '+':
				element._operator = PLUS;
				elements.push_back(element);
				break;
			case '-':
				element._operator = MINUS;
				elements.push_back(element);
				break;
			case '*':
				element._operator = MULTIPLY;
				elements.push_back(element);
				break;
			case '/':
				element._operator = DIV;
				elements.push_back(element);
				break;
			case '=':
				element._operator = SHOW;
				elements.push_back(element);
				break;
			case '?':
				break;
			default:
				return false;
			}
		}
		p++;
	}
	return solve(elements, result);
}
bool suffix_space(char *expression, double &result)
{
	char *p = expression;
	char digits[10];
	char *p2 = digits;
	vector <Element> elements;
	Element element;
	while (*p)
	{
		if (('0' <= *p && *p <= '9') || *p == '.')
		{
			*p2++ = *p;
		}
		else if (*p == ' ')
		{
			if (p2 != digits)
			{
				*p2 = '\0';
				element._operator = NUM;
				element.operand = atof(digits);
				elements.push_back(element);
				p2 = digits;
			}
		}
		else
		{
			switch (*p)
			{
			case '+':
				element._operator = PLUS;
				break;
			case '-':
				element._operator = MINUS;
				break;
			case '*':
				element._operator = MULTIPLY;
				break;
			case '/':
				element._operator = DIV;
				break;
			default:
				return false;
			}
			elements.push_back(element);
		}
		p++;
	}
	return solve(elements, result);
}

double inputAndSolve(bool (*function)(char *, double &))
{
	double result;
	char expression[1000];
	cin.ignore(100, '\n');
	while (1)
	{
		cin.getline(expression, 1000);
		if (!function(expression, result))
			cout << "输入有误,请重新输入:";
		else
			return result;
	}
}


int main()
{
	cout << "请选择一项:" << endl;
	cout << "<1> 输入带?引导符的后缀表达式" << endl;
	cout << "<2> 输入带空格的后缀表达式" << endl;
	cout << "<3> 输入中缀表达式" << endl << endl;
	cout << "请输入:";
	int choice;
	double result;
	while (!(cin >> choice) || choice < 1 || choice > 3)
	{
		cout << "您的输入有误,请重新输入:";
		cin.clear();
		cin.ignore(100, '\n');
	}
	switch (choice)
	{
	case 1:
		cout << "请输入后缀表达式:";
		result = inputAndSolve(suffix_q);
		break;
	case 2:
		cout << "请输入后缀表达式:";
		result = inputAndSolve(suffix_space);
		break;
	case 3:
		cout << "请输入中缀表达式:";
		result = inputAndSolve(infix);
		break;
	}
	cout << "求值结果:" << result << endl;
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值