下面說下這類題的大概思路:
1、中綴表示式變字尾的演算法:遇到運算元,直接輸出。
2、棧為空是,遇到運算子,直接入棧。
3、遇到左括號時,將其入棧。
4、遇到右括號時,執行出棧操作,並且開始將出棧的元素輸出。直到彈出棧的元素是左括號為止。
5、遇到其他運算子的時候,彈出所有優先順序大於等於該運算子棧頂元素,然後將該運算子入棧。最終將棧中的元素依次出棧。
例題
所謂中綴表示式,指的是運算子處於運算元的中間(例:3 * ( 4 + 2 )),中綴表示式是人們常用的算術表示方法,但中綴表示式不容易被計算機解析,因為既要考慮運算子的優先順序,還要考慮括號的處理。但中綴表示式仍被許多程式語言使用,因為它符合人們的普遍用法。字尾表示式,指的是不包含括號,運算子放在兩個運算元的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則,也不需要考慮括號)。
給出乙個中綴表示式,請將其轉換為字尾表示式並輸出。
輸入格式:
只有一行,是乙個長度不超過1000的字串,表示乙個中綴表示式。表示式裡只包含±*/與小括號這幾種符號。其中小括號可以巢狀使用。運算子、運算元之間用乙個空格分隔,資料保證輸入的運算元中不會出現負數,保證除數不會為0。
輸出格式:
輸出對應的字尾表示式。運算子、運算元之間用乙個空格分隔,但行尾無多餘空格。
輸入樣例:
3 * ( 4 + 2 )
輸出樣例:
3 4 2 + *
ac**如下:
#include
#include
#include
#include
using namespace std;
int main()
flag=
true;}
else}}
else
else
else
break;}
s.push
(v[i]);
}if(v[i]
=='*'
||v[i]
=='/'
)else
break;}
s.push
(v[i]);
}if(v[i]
==')')if
(s.top()
=='(')}
}if(v[i]
=='('
) s.
push
(v[i]);
}}}while
(!s.
empty()
)return0;
}
中綴表示式轉換為字尾表示式
今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...