資源簡介
用dev c++寫的代碼,附有啰里啰嗦的注釋和測試樣例。太簡單了不好意思要分。
代碼片段和文件信息
#include? //中綴表達式轉后綴表達式?
#include? //通過使用棧暫存運算符,實現運算符位置的調整?
#include? //tips:?中綴表達式即常見的表達式,可以用二叉樹表示。對該二叉?
#include? //樹進行后序遍歷可以得到后綴表達式(逆波蘭表達式)。?
#include?
using?namespace?std;
bool?isOperand(char?c); //判斷是否為操作數(變量)?
bool?isOperator(char?c); //判斷是否為操作符(運算符)?
bool?isHigherOperator(char?achar?b); //判斷操作符a的優先級是否高于b?
string?generalToRvsPolish(string?expression);//將中綴表達式轉為后綴表達式?
int?main()
{
while(true)
{
string?expression; //變量由單個字母表示,運算符僅限+-*/()
getline(cinexpression); //中間空格不影響結果?
string?rvsPolishNotation=generalToRvsPolish(expression);
cout< }
return?0;
}
bool?isOperand(char?c)
{
if((c>=‘a‘&&c<=‘z‘)||(c>=‘A‘&&c<=‘Z‘))
return?true;
else
return?false;
}
bool?isOperator(char?c)
{
if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘||c==‘(‘||c==‘)‘)
return?true;
else
return?false;
}
bool?isHigherOperator(char?achar?b) //a大于b為true,a小于等于b為false?
{
if(a==‘(‘||b==‘(‘) //左括號無優先級,可視為既與+-的優先級相同,又與*/的優先級相同?
return?true;
else?if(b==‘*‘||b==‘/‘)
return?false;
else?if(a==‘*‘||a==‘/‘)
return?true;
else
return?false;
}
string?generalToRvsPolish(string?expression)
{
int?len=expression.length();
char*?rvsPoCharArray=new?char[len]; //暫存后綴表達式的char數組?
int?j=0; //rvsPoCharArray當前處理的位置下標?
stack?operatorStack; //暫存操作符的棧,棧中始終保持上面的操作符的優先級高于下面的操作符,這是實現調整的關鍵?
for(int?i=0;i {
//cout<<“cur:?“<pression[i]< if(isOperand(expression[i])==true) //若為操作數直接輸出到rvsPoCharArray?
{
rvsPoCharArray[j]=expression[i];
j++;
}
if(isOperator(expression[i])==true) //字符為操作符,進行必要的調整?
{
if(operatorStack.empty()==true) //棧為空的情況:操作符直接入棧(若
評論
共有 條評論