ONP - Transform the Expression問題的python實現

原題鏈接

http://www.spoj.com/problems/ONP/

由題目可知,是把中綴表達式轉換爲後綴表達式(又稱逆波蘭表達式);

關於逆波蘭式,我比較懶,沒去翻書,可以參考下這篇博文:http://www.cnblogs.com/wanghetao/archive/2012/04/23/2466580.html

說明

博客裏面作者對算法,對"("出棧處理沒寫清楚,我把它詳細化了;還有對於運算符棧,裏面的括號判斷,因爲右括號沒有入棧,所以只需要判斷左括號。

關於運算符優先級比較,我這裏用了一個字典來定義,每個運算符映射到一個整數,數值越大,優先級越高;其它思路見下面內容。

算法核心

1. 從左往右掃描表達式;
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)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章