演算法 簡易綜合計算器(中綴表示式)棧

2021-10-04 22:20:19 字數 2081 閱讀 3561

使用棧完成表示式的計算 思路

通過乙個 index 值(索引),來遍歷我們的表示式

如果我們發現是乙個數字, 就直接入數棧

如果發現掃瞄到是乙個符號, 就分如下情況

3.1 如果發現當前的符號棧為 空,就直接入棧

3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符, 就需要從數棧中pop出兩個數,在從符號棧中pop出乙個符號,進行運算,將得到結果,入數棧,然後將當前的操作符入符號棧,如果當前的操作符的優先順序大於棧中的操作符, 就直接入符號棧.

當表示式掃瞄完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,並執行.

最後在數棧只有乙個數字,就是表示式的結果

public

class

calculator

else

}else

}else

else}}

//讓index + 1, 並判斷是否掃瞄到expression最後.

index++;if

(index >= expression.

length()

)}//當表示式掃瞄完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,並執行.

while

(true

) num1 = numstack.

pop();

num2 = numstack.

pop();

oper = operstack.

pop();

res = numstack.

cal(num1, num2, oper)

; numstack.

push

(res)

;//入棧

}int res2 = numstack.

pop();

//將數棧的最後數,pop出,就是結果

system.out.

printf

("表示式 %s = %d"

, expression, res2);}

}//定義乙個 arraystack2 表示棧, 需要擴充套件功能

class

arraystack2

//可以返回當前棧頂的值, 但是不是真正的pop

public

intpeek()

public

boolean

isfull()

public

boolean

isempty()

public

void

push

(int value)

top++

; stack[top]

= value;

}public

intpop()

int value = stack[top]

; top--

;return value;

}//顯示棧的情況[遍歷棧], 遍歷時,需要從棧頂開始顯示資料

public

void

list()

for(

int i = top; i >=

0; i--)}

//返回運算子的優先順序,優先順序是程式設計師來確定, 優先順序使用數字表示,/數字越大,則優先順序就越高.

public

intpriority

(int oper)

else

if(oper ==

'+'|| oper ==

'-')

else

}public

boolean

isoper

(char val)

//計算方法

public

intcal

(int num1,

int num2,

int oper)

return res;

}}

棧實現綜合計算器(中綴表示式)

定義兩個棧,乙個數字棧 numstack 乙個符號棧 operstack 我們定義乙個index來遍歷我們的表示式 定義乙個keepstring key幫助我們拼串 如果發現key是乙個數字,此時判斷key 的下乙個元素是不是數字,繼續向後遍歷,直到key的下乙個元素不是數字時,將integer.p...

棧實現綜合計算器(中綴表示式)

1.通過乙個index值 索引 來遍歷我們的表示式 2.如果發現是乙個數字,直接入棧 3.如果發現掃瞄到的是乙個符號,就分下面情況 1 如果發現當前的符號棧為空,就直接入棧 2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,就需要從數棧中pop出兩個數,再從符號...

棧 實現綜合計算器(中綴表示式)

棧 stack 棧的實現定義乙個top來表示棧頂,初始化為 1 入棧 當有資料入棧,top stack top data 出棧 value stack top top 綜合計算器的實現 計算器設計思路 含小括號 先定義兩個陣列棧。乙個用於儲存數字,乙個用於儲存運算符號 在定義乙個index用於讀取傳...