DSA 表達式求值&轉逆波蘭
float evaluate ( char* S, char*& RPN ) { //對(已剔除白空格的)表達式S求值猪叙,并轉換為逆波蘭式RPN
Stack<float> opnd; Stack<char> optr; //運算數棧德频、運算符棧
optr.push ( '\0' ); //尾哨兵'\0'也作為頭哨兵首先入棧
while ( !optr.empty() ) { //在運算符棧非空之前,逐個處理表達式中各字符
if ( isdigit ( *S ) ) { //若當前字符為操作數,則
readNumber ( S, opnd ); append ( RPN, opnd.top() ); //讀入操作數鉴分,并將其接至RPN末尾
} else //若當前字符為運算符秉沼,則
switch ( orderBetween ( optr.top(), *S ) ) { //視其與棧頂運算符之間優(yōu)先級高低分別處理
case '<': //棧頂運算符優(yōu)先級更低時
optr.push ( *S ); S++; //計算推遲蛮浑,當前運算符進棧
break;
case '=': //優(yōu)先級相等(當前運算符為右括號或者尾部哨兵'\0')時
optr.pop(); S++; //脫括號并接收下一個字符
break;
case '>': { //棧頂運算符優(yōu)先級更高時迎献,可實施相應的計算,并將結果重新入棧
char op = optr.pop(); append ( RPN, op ); //棧頂運算符出棧并續(xù)接至RPN末尾
if ( '!' == op ) { //若屬于一元運算符
float pOpnd = opnd.pop(); //只需取出一個操作數,并
opnd.push ( calcu ( op, pOpnd ) ); //實施一元計算叹侄,結果入棧
} else { //對于其它(二元)運算符
float pOpnd2 = opnd.pop(), pOpnd1 = opnd.pop(); //取出后巩搏、前操作數 /*DSA*/提問:可否省去兩個臨時變量?
opnd.push ( calcu ( pOpnd1, op, pOpnd2 ) ); //實施二元計算圈膏,結果入棧
}
break;
}
default : exit ( -1 ); //逢語法錯誤塔猾,不做處理直接退出
}//switch
}//while
return opnd.pop(); //彈出并返回最后的計算結果
}