time limit: 1000ms memory limit: 65536k 有疑問?點這裡^_^
對於乙個基於二元運算子的算術表示式,轉換為對應的字尾式,並輸出之。
輸入乙個算術表示式,以『#』字元作為結束標誌。
輸出該表示式轉換所得到的字尾式。
a*b+(c-d/e)*f#
ab*cde/-f*+
所謂 字尾式表示式 即是:計算機內部對算式的處理先後順序式!
此題寫了半個小時哈,資料結構課本裡的**實在是難看。故,本人只是參看了演算法,自己手敲的**,運用棧的思想,
我的**需要注意的地方是:當遇到 ' ) '時,該怎麼搞?!!
本人的一貫做法,對於棧只是我用來儲存的陣列,每次我都是用乙個e的下表指標來進行資料處理,遇到該出棧的資料,
我就把它給賦值掉,或者改變指標的位置,訪問不到那個資料哈!
將中綴式轉換為字尾式,需要考慮運算子的優先性。比如:a+b*c 不能轉換為:ab+c*,這是錯誤的。
應該轉換成:abc*+ 這樣才是對的。*的優先順序大於+,所以意味著先做*運算,再做+運算。
#include #include char a[1000];char s[1000];
int main()
else //如果是運算子
else if( e>0 ) //如果棧裡已有運算子出現了
if(a[i] == '+') //如果遇到的是+,運算優先順序低(+-*/ 均可在其前面運算)
else if(s[e-1]=='*' || s[e-1]=='/' ||s[e-1]=='+' || s[e-1]=='-' )
}if(a[i] == '-') //如果當前遇到的運算子是-
else if(s[e-1]=='-' || s[e-1]=='*' || s[e-1]=='/' || s[e-1]=='+' )
}if( a[i] == '*') // 他如果當前遇到的是*
else if(s[e-1]=='*' || s[e-1]=='/' ) // 如果是這些運算子,>=(*)的優先順序
}if( a[i] == '/') // 和*運算子的做法一致
else if(s[e-1]=='*' || s[e-1]=='/' )
}if( a[i] == ')') // 如果是右括號呢???
else}}
}}
i++;
}for(k=e-1; k>=0; k--)
printf("\n");
}return 0;
}
stl 的寫法:
#include #include #include #include #include #include using namespace std;int main()
else
else
if(e>0
)
case'+
':else
if(s[e-1]=='
*' || s[e-1]=='
/' ||s[e-1]=='
+' || s[e-1]=='-'
)
}case'-
':else
if(s[e-1]=='
-' || s[e-1]=='
*' || s[e-1]=='
/' || s[e-1]=='+'
)
}case'*
':else
if(s[e-1]=='
*' || s[e-1]=='/'
)
}case'/
':else
if(s[e-1]=='
*' || s[e-1]=='/'
)
}case')
':else}}
}}
}i++;
}for(k=e-1; k>=0; k--)
printf("\n
");}
}
一般算術表示式轉換成字尾式
time limit 1000ms memory limit 65536k 有疑問?點這裡 對於乙個基於二元運算子的算術表示式,轉換為對應的字尾式,並輸出之。輸入乙個算術表示式,以 字元作為結束標誌。輸出該表示式轉換所得到的字尾式。a b c d e f ab cde f includeusing ...
棧之一般表示式轉換成字尾式
對於乙個基於二元運算子的算術表示式,轉換為對應的字尾式,並輸出之。輸入乙個算術表示式,以 字元作為結束標誌。輸出該表示式轉換所得到的字尾式。a b c d e f ab cde f include include include define maxsize 10000 define sizenum...
表示式轉換 中綴表示式轉換為字尾表示式
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...