算术表达式求值
[问题描述] 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“运算符优先法”求算术表达式的值。
解题思路:
1.首先建立两个栈用来分别存储操作数(operand)以及运算符(operator),为了减少代码量就直接调用STL中的栈方法来对“入栈”“出栈”以及“访问栈顶元素”进行操作。
2.最重要的一点是“如何才能使表达试正确遵循运算法则”(先乘除后加减,先算括号内的再处理括号外的),这就涉及到运算符优先级的问题,即在 Precede()方法中用二维数组定义好运算符的优先关系,然后根据方法返回的结果进行不同的操作。
3.最后是关于输入问题,操作数和运算符都只用字符型来输入,然后通过字符的ASCII码值来区分是是操作数还是运算符,然后正确进栈。
下面直接上代码,代码中有详细解释
#include<iostream>
#include<stack>
#include<cmath>
using namespace std;
stack<char>OPTR;
stack<double>OPND;
typedef struct {
//因为在输入表达式时是一个一个的输入字符,而操作数若长度大于2则无法正确得到操作数,因此该结构是用来存储一个完整的字符数,便于在CharTOInt()中将其转换为数字
char data[10];
int length;
}haha;
bool In(char ch)//判断输入的是不是运算符,若是则返回true
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')'||ch=='#')
{
return true;
}
else return false;
}
char Precede(char x, char y)//运算符优先级的判断
{
int ang[2];
char opnd[2] = {
x,y };
char aa[7][7] = {
{
'>','>','<','<','<','>','>'},
{
'>','>',