[英]Need help understanding how using both a stack and binary search tree is relevant in an advanced Reverse Polish Notation program
我在C中有一個項目任務,我正在嘗試思考應該如何去做。 我可以嘗試解釋作業的所有部分,但我想僅引用整個內容會更有意義:
NAME rpcalc-一個簡單的RPN計算器
名稱
rpcalc-一個簡單的RPN計算器和轉換工具
概要
rpcalc [-e | -c | -g]表達式
描述
rpcalc實用程序可以對用反向拋光表示法編寫的算術表達式執行幾種可能的操作,並將結果寫入標准輸出。
默認情況下(即,如果沒有選項傳遞給程序),該實用程序將評估表達式。 用戶將命令行選項-e傳遞給程序時,也會使用此行為。
如果用戶通過命令行選項-c,則程序會將表達式轉換為其等效的中綴表示法,僅在必要時才將子表達式括起來。
如果用戶通過了命令行選項g,則程序將以模擬匯編語言生成一系列指令,如果由假設的計算機執行,則會對表達式進行求值。 程序輸出的指令序列假定存在無限數量的機器寄存器。
輸入語法
rpcalc實用程序假定輸入表達式使用以下二進制運算符整數:
A-表示加法S-表示減法X-表示乘法D-表示整數除法M-表示模運算例如,該程序可以按以下方式運行:
rpcalc 5 4 + X 18 S 5 D 3 52
rpcalc -c 5 4 + X 18 S 5 D 3((5 + 4)* 18-5)/ 3
模仿大會語言
通過使用-g選項輸出的匯編語言非常簡單,包括以下說明:
MOV R#值
-R#表示編號的寄存器(例如R1,R2等)
-VALUE表示整數
-此格式的指令讀為:“將VALUE移入寄存器R#”。
添加R#1 R#2 R#3
-R#1,R#2和R#3表示不同的寄存器
-這種形式的指令讀為:“將寄存器R2的內容添加到
-寄存器R1的內容,將結果保存到寄存器R3”
SUB R#1 R#2 R#3
-R#1,R#2和R#3表示不同的寄存器
-這種形式的指令應理解為:“從寄存器R1的內容中減去寄存器R2的內容,並將結果保存到寄存器R3中”
MUL R#1 R#2 R#3
-R#1,R#2和R#3表示不同的寄存器
-這種形式的指令應理解為:“將寄存器R1的內容乘以寄存器R2的內容,並將結果保存到寄存器R3”
DIV R#1 R#2 R#3
-R#1,R#2和R#3表示不同的寄存器
-這種形式的指令應理解為:“將寄存器R1的內容除以寄存器R2的內容,將商保存到寄存器R3中”
MOD R#1 R#2 R#3
-R#1,R#2和R#3表示不同的寄存器
-這種形式的指令應理解為:“將寄存器R1的內容除以寄存器R2的內容,將余數保存到寄存器R3”
WRT R#1
-R#1表示一個寄存器
-這種形式的指令讀為:“將R1的內容寫入屏幕”
如您所見,它比簡單的RPN計算器還要多一點。 本學期初,我們不得不做一個基本的RPN計算器作為實驗室,而我只是使用了堆棧實現。 對於該程序,我們的教授告訴我們實現此目標的最佳方法是同時使用堆棧和二進制搜索樹。 我希望有人可以將其分解為我,為什么我需要此程序同時使用這兩個數據結構,或者為什么最需要它。 據我所知,我應該能夠使用任何一種數據類型來完成程序,而看不到使用這兩種數據的相關性。 如果有人可以解釋他們對此的想法,我將不勝感激。
謝謝
我同意對於純RPN實現而言,堆棧就足夠了。 但是,似乎也支持帶括號的前綴表示法,這要求在處理之前先構建語法樹。 另外,您可以使用二叉樹搜索與每個指令令牌相關的功能(我想您只是有一個簡單的switch .. case
)。
但是,這只是一個粗略的猜測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.