**實現
//直接計算中綴表示式
//不含括號
#include#include#includeusing namespace std;
//運算符號優先順序比較
//加減為低階運算,乘除是高階運算;先算乘除
//return 1 means can calculate, else can not.
int getpriority( stackoperators )
return 0;
}//輸入操作符棧 和 運算元棧 進行計算
void calculate(stack&operands, stack&operators)
//cout << op1 << operation << op2 << "=" << res << endl; //test
operands.push(res);
}int main()
operands.push( stod(number) );
number.clear();
//讀完最後乙個數字
if ( c == formula.end() )
break;
}} //calculate, 先算乘除
if( operation.find(*c) != string::npos )
operators.push((*c));
} }//處理剩餘的加減
while( !operators.empty() )
else
} else }
cout << formula << " = " << operands.top() << endl;
return 0;
}
//直接計算中綴表示式
//含括號
#include#include#includeusing namespace std;
//運算符號優先順序比較
//return 1 means can calculator, else can not.
int getpriority( dequeoperators )
return 0;
}double calculate( double op1, double op2, char operation )
//cout << op1 << operation << op2 << "=" << res << endl; //test
return res;
}void calculator(deque&operands, deque&operators)
else
res = calculate( op1, op2, operation );
operands.push_back(res);
}int main()
operands.push_back( stod(number) );
number.clear();
//讀完最後乙個數字
if ( c == formula.end() )
break;
}} //處理 + - * /
if( operation.find(*c) != string::npos )
operators.push_back((*c));
} //處理括號
else
//遇到)」時,算出()內算式的值
else
//此時括號內已經沒有乘除
dequetmp_oprands;
dequetmp_operators;
//把()內的算式pop到新的棧
while( operators.back() != '(' )
tmp_oprands.push_back(operands.back());
operands.pop_back();
operators.pop_back(); //彈出「(」
while(!tmp_operators.empty())
operands.push_back( tmp_oprands.back() ); //push結果
tmp_oprands.pop_back();}}
} //處理剩餘的加減
double op1, op2, res;
char operation;
while( !operators.empty() )
cout << formula << " = " << operands.back() << endl;
return 0;
}
前面的演算法將加減與乘除分開處理,導致後面運算加減的時候還要考慮減法的運算順序問題,變得麻煩了。
下面是改進後的**
#include#include#includeusing namespace std;
//return the answer of op1 operation op2
double calculate( double op1, double op2, char operation )
cout << op1 << operation << op2 << " = " << res << endl; //test
return res;
}int getpriority( char operation )
void calculator( stack&operands, stack&operators )
//(1+2)*33-8/2-9
int main()
c--; //退一步
operands.push( stod(num) );
//cout << operands.top() << endl; //test
} //運算
else if( operators.find(*c) != string::npos )
operators.push(*c);
}} //括號處理
else
operators.pop();
}} }
while( !operators.empty() )
cout << formula << " = " << operands.top() << endl;
return 0;
}
中綴表示式
輸入乙個中綴表示式 由 0 9組成的運算數 加 減 乘 除 四種運算子 左右小括號組成。注意 也可作為負數的標誌,表示式以 作為結束符 判斷表示式是否合法,如果不合法,請輸出 no 否則請把表示式轉換成字尾形式,再求出字尾表示式的值並輸出。注意 必須用棧操作,不能直接輸出表示式的值。輸入格式 第一行...
中綴表示式 字尾表示式
中綴表示式就是 a b 這樣的,運算子在兩個數的中間 字尾表示式就是 a b 這樣的,運算子在兩個數後面 再細分一下 中綴表示式 字尾表示式 a b c a b c a b c a b c a b c a b c a b c a b c a b c d e a c a b c d e a c emm...
中綴表示式 字尾表示式
數學表示式稱為中綴表示式,符合人的思考習慣 1 2 3運算子放在數字後面,符合計算機運算 123 遍歷中綴表示式中的數字和符號 左括號 入棧 運算符號 需要與棧頂符號進行優先順序比較 遍歷結束 將棧中所有符號彈出並輸出。例 中綴表示式 1 2 5 3 4 2 1 1 數字1直接輸出 結果 1 棧 空...