原題鏈接
http://www.spoj.com/problems/ONP/
由題目可知,是把中綴表達式轉換爲後綴表達式(又稱逆波蘭表達式);
關於逆波蘭式,我比較懶,沒去翻書,可以參考下這篇博文:http://www.cnblogs.com/wanghetao/archive/2012/04/23/2466580.html
說明
博客裏面作者對算法,對"("出棧處理沒寫清楚,我把它詳細化了;還有對於運算符棧,裏面的括號判斷,因爲右括號沒有入棧,所以只需要判斷左括號。
關於運算符優先級比較,我這裏用了一個字典來定義,每個運算符映射到一個整數,數值越大,優先級越高;其它思路見下面內容。
算法核心
2. 若讀取的是操作數,則將該操作數存入操作數堆棧;
3. 若讀取的是運算符:
3.1. 若運算符爲左括號"(",則直接存入運算符堆棧;
3.2. 該運算符爲右括號")",則運算符堆棧持續出棧,直到出棧的運算符不是"("時停止,並把運算輸出到操作數堆棧;
3.3. 該運算符爲非括號運算符:
3.3.1. 若運算符堆棧棧頂的運算符爲"(",則直接存入運算符堆棧;
3.3.2. 若比運算符堆棧棧頂的運算符優先級高或相等,則直接存入運算符堆棧;
3.3.3. 若比運算符堆棧棧頂的運算符優先級低,則輸出棧頂運算符到操作數堆棧,並將當前運算符壓入運算符堆棧;
4. 當表達式讀取完成後運算符堆棧中尚有運算符時,並且運算符不是"(",則依序取出運算符到操作數堆棧,直到運算符堆棧爲空。
python實現
priority = {'+':0, '-':1, '*':2, '/':3, '^':4}
stack_number = []
stack_operator = []
output = ""
line = input()
for t in range(line):
s = raw_input()
for i in s:
if i.isalpha():
stack_number.append(i)
elif i == '(':
stack_operator.append(i)
elif i == ')':
c = stack_operator.pop(-1)
while c == '(':
c = stack_operator.pop(-1)
if c != '(':
stack_number.append(c)
elif i in priority:
if stack_operator[-1] == '(':
stack_operator.append(i)
elif priority[i] >= priority[stack_operator[-1]]:
stack_operator.append(i)
else:
stack_number.append(stack_operator.pop(-1))
stack_operator.append(i)
else:
exit(0)
while len(stack_operator) != 0:
c = stack_operator.pop(-1)
if c != '(':
stack_number.append(c)
# OUTPUT
for j in stack_number:
output += j
if t != line-1:
output += "\n"
stack_number
stack_number = []
stack_operator = []
print(output)