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