棧(字尾表示式的計算)

2021-10-24 11:49:48 字數 2645 閱讀 5449

就我個人來說,字尾表示式看起來很彆扭,但是從變成來看,字尾表示式的處理比中綴表示式的處理方便很多。

中綴表示式:( 30 + 4 ) x 5 - 6 = 164

字尾表示式:30 4 + 5 x 6 - = 164

對於中綴表示式而言,一般需要兩個棧:數棧和符號棧,並且處理過程中需要注意括號運算。就上面的中綴表示式來看,先計算括號裡的+,再計算x,最後計算 - 。但是,就字尾表示式來看,表示式中的運算符號出現順序與中綴表示式對應的計算順序是一樣的,因此,計算字尾表示式只需乙個棧,存放數值即可。若掃瞄到數值,則直接入棧;若掃瞄到運算子,則pop兩個數值做運算,再將運算結果入棧,最後,棧中必定只剩下乙個數值,即結果。

**如下(此段**是學習別人的,稍許修改):

public

class

calculatorbehind

// 掃瞄字尾表示式,依次分割數值、運算子

public

static arraylist

getarraylistexpression

(string expr)

// 計算字尾表示式的結果,並返回

public

static

intcalculate

(arraylist

expression)

// 如果是運算子,則從棧中pop兩個數值,作運算,再將結果入棧

else

stack.

push

(string.

valueof

(result));

}}// 返回結果

return integer.

parseint

(stack.

pop())

;}}

我們在做數學描述時,都是利用中綴表示式實現,但是,計算機實現字尾表示式的計算卻更簡單。因此,可以將中綴表示式轉換為字尾表示式,再進行計算。

處理思路:

結果棧中的元素從棧底至棧頂輸出,即為字尾表示式

**如下(利用list實現的):

public

class

middletobehind

// 將中綴表示式轉換為字尾表示式

public

static list

middle_to_behind

(string expression_middle)

// 如果是運算子

else

// 如果該字元的優先順序大於棧頂字元優先順序,則直接入棧(符號棧)

elseif(

!str.

equals

(")")&&

priority

(str)

>

priority

(operstack.

get(operstack.

size()

-1))

)// 如果該字元是 ),不斷pop,直到棧頂字元是(,並刪除(

else

if(str.

equals

(")"))

operstack.

remove

(operstack.

size()

-1);

}// 如果該字元的優先順序小於等於棧頂字元優先順序,不斷pop,直到棧頂字元是(,或者該字元的優先順序大於棧頂字元優先順序

elseif(

priority

(str)

<=

priority

(operstack.

get(operstack.

size()

-1))

)}operstack.

add(str);}

}}// 將符號棧元素pop,並push至結果棧

while

(!operstack.

isempty()

)// 結果棧的逆序輸出即為轉換得到的字尾表示式

return resstack;

}// 根據字尾表示式計算

public

static

intcalculate_with_behind

(list

express_behind)

else

resultstack.

add(string.

valueof

(result));

}}return integer.

parseint

(resultstack.

get(resultstack.

size()

-1))

;}// 判斷運算子優先順序

public

static

intpriority

(string str)

else

if(str.

equals

("*"

)|| str.

equals

("/"))

else

if(str.

equals

("+"

)|| str.

equals

("-"))

else

}}

計算表示式值(字尾表示式) 棧

處理表示式主要是對優先順序以及括號的判斷 1.運算子棧頂的優先順序小於加入的時,需要將所有的不評級的取出並計算,2.當遇到 時,需要括號內的運算全部處理 2.其他情況全部加入運算子棧和資料棧 include include include using namespace std typedef lo...

利用棧計算字尾表示式

字尾表示式又稱作逆波蘭式,操作符在運算數的後面,所以叫做字尾表示式。例如 1 2 3的字尾表示式是 1 2 3 可以 2 3 看作乙個運算數a,1 a 也符合運算數 運算數 操作符的格式。的特殊處理 因為要處理大於9的數,所以要在每個數和操作符後加上空格,將相鄰的數分隔開。字尾表示式以字串的形式存在...

字尾表示式 棧

若干行,每行對應乙個中綴表示式 若干行,每行對應乙個由中綴表示式轉換而來的字尾表示式 x a y b z f a b c d m n s t y a b c d e f gxayb zf abc dm n st y abc def g 解題思路 首先如何實現中綴表示式轉換成字尾表示式,方法如下 1....