表达式求值(C++,代码)

#include<iostream>
#include<stack>
#include<sstream>
using namespace std;
int In(char ch)//判断是否为运算符
{
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')'||ch=='#')
		return 1;
	else
		return 0;
}
char Precede(char ch1, char ch2)//判断优先级,ch1栈顶元素
{
	char flag='>';
	if (ch1 == '+')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '#':
		case ')':
			flag = '>';
			break;
		case '*':
		case '/':
		case '(':
		
			flag = '<';
			break;
		}
	}
	else if (ch1 == '-')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '#':
			flag = '>';
			break;
		case '*':
		case '/':
		case '(':
		case ')':
			flag = '<';
			break;
		}
	}
	else if (ch1 == '*')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '#':
		case '*':
		case '/':
		case ')':
			flag = '>';
			break;
		case '(':
			flag = '<';
			break;
		}
	}
	else if (ch1 == '/')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '#':
		case '*':
		case '/':
		case ')':
			flag = '>';
			break;
		case '(':
			flag = '<';
			break;
		}
	}
	else if (ch1 == '(')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
			flag = '<';
			break;
		case ')':
			flag = '=';
			break;
		}
	}
	else if (ch1 == ')')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '*':
		case '/':
		case ')':
		case '#':
			flag = '>';
			break;
		}
	}
	else if (ch1 == '#')
	{
		switch (ch2)
		{
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
			flag = '<';
			break;
		case '#':
			flag = '=';
			break;
		}
	}
	return flag;
}
int Operate(int a, char b,int c)//运算
{
	if (b == '+')
		return a + c;
	else if (b == '-')
		return a - c;
	else if (b == '*')
		return a * c;
	else  
		return a / c;
}
int main()
{
	stack<char> OPTR;//运算符栈
	stack<int> OPND;//操作数栈
	OPTR.push('#');
	char ch;
	cin >> ch;
	while (ch != '#' || OPTR.top() != '#')
	{
		if (!In(ch))//不为运算符,进入操作数栈
		{
			int a;
			stringstream stream;
			stream << ch; stream >> a;
			OPND.push(a);
			cin >> ch;
		}
		else
		{
			switch (Precede(OPTR.top(), ch))//运算符栈栈顶元素与ch比较
			{
			case '<'://优先级低于,ch压入运算符栈
				OPTR.push(ch);
				cin >> ch;
				break;
			case '>'://优先级高于,栈顶元素弹出,弹出操作数栈两个数,进行运算
				char theta;
				int A, B;
				theta=OPTR.top();
				OPTR.pop();
				A = OPND.top(), OPND.pop();
				B = OPND.top(), OPND.pop();
				OPND.push(Operate(B,theta, A));
				break;
			case '='://括号相等
				OPTR.pop();
				cin >> ch;
				break;
			}
		}
	}
	cout << OPND.top();
}

猜你喜欢

转载自blog.csdn.net/qq_74156152/article/details/133279277