棧底放『#』,用來標記棧底,從左至右逐字讀取中綴式:
a.當當前字元為數字時,直接輸出;
b.當當前字元為"("時,將其壓棧;
c.當當前字元為")"時,則彈出堆疊中最上的"("之前的所有運算子並輸出,然後刪除堆疊中的"(" ;
d.當當前字元為運算子時,則依次彈出堆疊中優先順序大於等於當前運算子的(到"("之前為止),輸出,再將當前運算子壓棧; 即:當前運算子大於棧頂運算子時,入棧;當前運算子小於等於棧頂運算子,出棧直至大於棧頂運算子或棧為空,最後把當前運算子入棧。
e.當遍歷完中綴式後,棧中還有非'#'的運算子,則彈出所有棧中的運算子
中綴式:1*(2+3)/4+5,字尾式:123+*4/5+
#include #include #include using namespace std;
stackst;
int cmp(char c1,char c2)//比較優先順序
void convert(char *p1,char *p2)
if(p1[i]==')')//出現')',則棧中肯定有'(',彈出,直至遇到'('。這裡預設輸入的是合法中綴式。
st.pop();//彈出'('
} //當前運算子大於棧頂運算子時,入棧;當前運算子小於等於棧頂運算子,出棧直至大於棧頂運算子或棧為空,最後把當前運算子入棧。
if(p1[i]=='+'||p1[i]=='-'||p1[i]=='*'||p1[i]=='/')
else//否則,出棧,直至棧空或遇到大的運算子
st.push(p1[i]);
}} }
while(st.top()!='#')//若棧中還有運算子,都彈出
p2[j]='\0';//最後加上\0
中綴式轉字尾式
將中綴表示式轉化為字尾表示式 我們把平時所用的標準四則運算表示式,即 9 3 1 3 10 2 叫做中綴表示式。因為所有的運算符號都在兩數字的中間,現在我們的問題就是中綴到字尾的轉化。中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 9 3 1 3 10 2 下面我們來具體看看這個過程。1.初...
中綴式轉字首式 轉字尾式
1 從左向右讀取字元,新建陣列suffix用來儲存字尾表示式 2 如果遇到 入棧,繼續讀取。3 如果遇到 將棧頂元素依次出棧存到suffix中,直到棧頂元素為 此時將棧頂元素出棧,繼續讀取。4 如果遇到運算子,將其與棧頂元素進行比較,如果該運算子優先順序小於等於棧頂元素,則將棧頂元素出棧,存到suf...
中綴式變字尾式
時間限制 1000 ms 記憶體限制 65535 kb難度 3描述 輸入第一行輸入乙個整數n,共有n組測試資料 n 10 每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式的中綴式,每個表示式都是以 結束。這個表示式裡只包含 與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入...