棧與佇列 常見習題總結(下)

2021-09-27 16:05:36 字數 2096 閱讀 6700

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,入...