4.模擬計算器 實現四則運算
(1)中綴表示式轉字尾表示式
轉換規則:從左到右遍歷中綴表示式的每乙個數字和符號,若是數字,直接輸出成為字尾表示式的一部分,若是運算符號,首先判斷其與棧頂元素的優先順序,如果是右括號或是優先順序高於棧頂元素(乘除優於加減)的符號,直接入棧,否則,則將棧頂元素依次出棧並輸出,並將當前符號入棧,直到棧空即輸出字尾表示式為止。以「9+(3-1)×3+10÷2」為例,挑選其中最複雜的兩個步驟進行**說明:
輸出9,「+」入棧,「(」 直接入棧 《優先順序最高》,輸出3,「-」入棧,下乙個符號為「)」,我們需要去找與之對應的左括號「(」,所以棧頂元素依次出棧,直至「(」 出棧為止,即輸出「-」。
輸出8,""入棧,輸出2,「÷」、「+」依次出棧。
最終字尾表示式的輸出結果為:「9 3 1 - 3 × + 10 2 ÷ +」
(2)字尾表示式計算結果
轉換規則:從左到右遍歷字尾表示式的每個數字和符號,若為數字則進棧,若為符號,則將處於棧頂的兩個數字出棧,進行相對應的加減乘除運算,將運算結果入棧,直到棧空得到最終計算結果。仍然以「9 3 1 - 3 × + 10 2 ÷ +」字尾表示式為例簡單描述這個過程:
9、3、1依次入棧,下一符號為「-」,則將3、1出棧進行3-1操作,將結果2入棧,同理繼續進行3×2操作,將結果6入棧,直至得到最後結果20,將結果輸出。
(3)附**如下:
class
calculate
return result;
}//加減乘除運算
private
static
intoperator
(int item1,
int item2,
char operate)
return result;
}//中綴表示式轉字尾表示式
public
static string infixtopostfix
(string str)
else
if(value==
')')
stack.
pop();
}else
//若棧空或運算子為'(',直接入棧
if(stack.
isempty()
||value==
'(')
//否則判斷優先順序後進行相關操作
//將優先順序高的運算子直接入棧if(
getpriority
(stack.
peek()
)<
getpriority
(value)
)else
//將當前符號入棧操作
stack.
push
(value);}
}}while
(!stack.
isempty()
)return result;
}//字尾表示式計算結果
public
static
intcal
(string str)
if(value >=
'0'&& value <=
'9')
stack.
push
(integer.
valueof
(subnumber));
if(value==
' ')
}else
}return stack.
pop();
}}public
class
calculater
}}
執行結果:
棧與佇列習題選做
1 假設以i和o表示入棧和出棧操作,棧的初態和終態均為空,入棧和出棧的操作序列可表示為僅由i和o組成的序列,可以操作的序列為合法序列,否則為非法序列,寫出乙個演算法,判定所給的操作序列是否合法,如果合法,返回true,非法返回false bool empty stack seqstack l boo...
棧與佇列操作總結
c 有棧和佇列的函式 include include queue int q 定義int型別為例 stack int s stack 堆疊 是乙個容器類的改編,提供了堆疊的全部功能,也就是說實現了乙個先進後出 filo 的資料結構。操作比較和分配堆疊 empty 堆疊為空則返回真 pop 移除棧頂元...
總結學習棧與佇列
棧和佇列都是特殊的線性表,對線性表的插入與刪除操作位置進行了限定。棧是一種先進後出的資料結構,只能在棧頂進行插入與刪除 佇列是一種先進先出的資料結構,只能在隊尾查入隊頭刪除。與線性表一樣,棧和佇列都可以分別用順序儲存和鏈式儲存的形式實現。1.棧的順序儲存結構實現 設定空棧標誌為棧頂指標top 1,入...