time limit: 1000ms memory limit: 65536k
小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。
因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解決吧。
輸入一算術表示式,以\'#\'字元作為結束標誌。(資料保證無空格,只有一組輸入)
輸出該表示式轉換所得到的字首式 中綴式 字尾式。分三行輸出,順序是字首式 中綴式 字尾式。
a*b+(c-d/e)*f#
+*ab*-c/defa*b+c-d/e*f
ab*cde/-f*+
字首規律:
1) 設立操作符棧optr,結果棧result;
2) 從右向左遍歷,若當前字元是運算元,則直接傳送給result棧;
3) 若當前運算子的優先數高於等於棧頂運算子,則進optr棧;
4) 否則,退出棧頂運算子傳送給result棧;
5) 「)」 對它之前後的運算子起隔離作用,「(」可視為自相應右括弧開始的表示式的結束符。(即讀到右括號時總是將它壓入optr棧中,讀到左括號時,將靠近棧頂的第乙個右括號上面的運算子全部依次彈出,送至result棧後,再丟棄右括號。 )
字尾規律:
1) 設立操作符棧;
2) 若當前字元是運算元,則直接傳送給字尾式;
3) 若當前運算子的優先數高於棧頂運算子,則進棧;
4) 否則,退出棧頂運算子傳送給字尾式;
5) 「(」 對它之前後的運算子起隔離作用,「)」可視為自相應左括弧開始的表示式的結束符。(即讀到左括號時總是將它壓入棧中,讀到右括號時,將靠近棧頂的第乙個左括號上面的運算子全部依次彈出,送至輸出佇列後,再丟棄左括號。 )
#include
#include
#include
#define stackmax 10000
#define stacknum 10000
typedef int elemtype;
typedef struct
sqstack;
int initstack(sqstack &s)
char push(sqstack &s, char e)
*s.top++=e;
}int pop(sqstack &s)
char gettop(sqstack &s)
int stackempty(sqstack &s)
int cmp(char c)//用於比較優先順序
char lasttranslate(sqstack &s, char c)
else
pop(s);
}else
}else}
}}}} }
char pretranslate(sqstack &s1, sqstack &s2, char c)
else
pop(s2);
}else
}else
}void putstack1(sqstack &s)
}void putstack2(sqstack &s)
}char midtranlate(char c)
算術表示式的轉換
小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解決吧。輸入 輸入一算術表示式,以 字元作為結束標誌。資料保證無空格,只有一組...
算術表示式的轉換
time limit 1000ms memory limit 65536k 小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解...
算術表示式的轉換
這道題卡了好久,從網上找的 但不是用棧做的,儲存起來當演算法看吧。time limit 1000ms memory limit 65536k 小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想...