#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();
}
表达式求值(C++,代码)
猜你喜欢
转载自blog.csdn.net/qq_74156152/article/details/133279277
今日推荐
周排行