思路
1、初始化两个栈,OPTR保存运算符,OPND保存操作数
2、从左—>右边获元素。
3、遇操作数,进栈OPND。
3、遇界限符:‘(’,入栈OPTR;‘)’,依次出栈直到遇见’(',消除一对括号。
4、遇运算符:依次取OPTR栈顶与当前运算符比较优先级:
a)、当前运算符优先级高,入栈OPTR
b)、当前运算符优先级低,出栈OPTR,依次出栈OPND右操作数、左操作数进行运算,将运算结果入栈OPND。
算符间的优先关系
关键代码
运算符优先级判别
/* 运算符优先级判别 */
char Preced( char topEmle_T, char cur_T)
{
// topEmle_T:运算符栈顶,cur_T:当前运算符
switch (cur_T)
{
case '(': return '<';
case '-': case '+':
if ( topEmle_T=='(' ) return '<';
else return '>';
case '*': case '/':
if(topEmle_T=='(' || topEmle_T=='-'|| topEmle_T=='+') return '<';
else return '>';
case ')':
if ( topEmle_T== '(' ) return '=';
else return '>';
case '#':
if ( topEmle_T== '#') return '=';
else return '>';
}
}
表达式求值
//表达式求值(后缀表达式)
void EvaluateExpression()
{
//OP为运算符集合
char OP[MaxSize] = {'(','+','-','*','/',')','#'};
// 建立两个栈,OPTR:存算符,OPND:存操作数
LinkStack_T OPTR; LinkStack_N OPND;
// 初始化栈
InitStack_T(OPTR); InitStack_N(OPND);
// 算符栈底放入标识符
Push_T(OPTR,'#');
// 后缀表达式
string str="";
char theta,x; // theta:操作符
int a, b, tag; // 左操作数,右操作数,tag标识元素入了哪个栈
char c = getchar();
while ( c!='#' || getTop_T(OPTR)!='#')
{
if(!isOperator(c,OP))
{
// 上一步是操作数插入栈
if(tag==0)
{
Pop_N(OPND,b);
Push_N(OPND,b*10+(c-'0'));
}else{
Push_N(OPND,c-'0');
}
tag = 0;
str = str + c; // 后缀表达式
c = getchar();
}else{
//如果运算符栈 栈顶元素为'#',直接插入运算符
if(getTop_T(OPTR)=='#')
{
Push_T(OPTR,c);
tag = 1;
c = getchar();
continue;
}
switch (Preced(getTop_T(OPTR),c))
{
case '<':
Push_T(OPTR,c);
tag = 1;
c = getchar();
break;
case '=':
Pop_T(OPTR,x);
c = getchar();
break;
case '>':
Pop_T(OPTR,theta);
Pop_N(OPND,b);
Pop_N(OPND,a);
Push_N(OPND,Opearte(a,theta,b));
str = str + theta;
break;
}
}
}
cout <<"后缀表达式 = " << str << endl;
cout <<"表达式的值 = " << getTop_N(OPND);
}