棧(stack)
棧的實現
定義乙個top來表示棧頂,初始化為-1綜合計算器的實現入棧:當有資料入棧,top++,stack[top]=data
出棧:value=stack[top],top- -
計算器設計思路(含小括號)
先定義兩個陣列棧。乙個用於儲存數字,乙個用於儲存運算符號
在定義乙個index用於讀取傳進來的算式
遇到數字,將其傳入數字棧
遇到運算符號向符號棧存入,如果符號棧中沒有符號就直接入棧;當遇見左括號『(』時,直接入棧;當遇見右括號』)'時需要將括號中的算式全部運算完畢,直到遇見左括號,停止運算,將左括號出棧;如果將要入棧的符號優先順序大於棧頂的符號直接入棧;如果將要入棧的符號優先順序小於或等於棧頂符號,先出棧兩個數字,先用要入棧的符號進行運算,將結果入數字棧。
當讀完表示式,將棧中剩餘的數字進行依次運算
運算規則:先出棧兩個數字,再出棧乙個符號,用後出棧的數字對先出棧的數字進行運算,將結果入數字棧
**實現
package stack;
/** * 含括號多位加減乘除計算器
* 運用棧
*/public
class
arraystackdemo
}
/**
* 計算器類(含括號,多位運算)
*/class
calculator
}else
if(ch ==
'=')
//當讀取到等號時停止讀取
else
else
if(ch ==
')')
//判斷是不是右括號
else}}
else
else
else}}
} index++;}
//所有的算式都拆分完成了,運算棧中剩下的數字
while
(true
)else}}
//判斷是不是運算符號(加,減,乘,除,括號,等號)
public
boolean
isoperation
(char ch)
//對運算符號進行優先順序分類
//加減=1 乘除=2 左括號=0 右括號=3 等號=-1
public
intclassifyoperation
(char ch)
else
if(ch ==
'*'|| ch ==
'/')
else
if(ch ==
'(')
else
if(ch ==
')')
else
}//對比符號的優先順序,ch為讀取的當前運算子,operstack為當前符號棧
//返回正確為當前符號優先順序大於棧頂元素優先順序;錯誤為當前符號優先順序小於等於棧頂元素優先順序;
public
boolean
comparepriority
(char ch, arraystack operstack)
else
}//從數字棧和符號棧自動出棧進行運算
//num1是先出棧的數字 num2是後出棧的數字 oper是運算符號 numstack是數字棧 operstack是符號棧
public
intcount
(arraystack numstack, arraystack operstack)
}}
/**
* 棧類
*/class
arraystack
//判滿
public
boolean
isfull()
//判空
public
boolean
isempty()
//入棧
public
void
push
(int data)
top++
; stack[top]
= data;
}//出棧
public
intpop()
int value = stack[top]
; top--
;return value;
}//顯示棧
public
void
showstack()
}//返回棧頂(棧頂不出棧)
public
intshowtop()
}``
棧實現綜合計算器(中綴表示式)
定義兩個棧,乙個數字棧 numstack 乙個符號棧 operstack 我們定義乙個index來遍歷我們的表示式 定義乙個keepstring key幫助我們拼串 如果發現key是乙個數字,此時判斷key 的下乙個元素是不是數字,繼續向後遍歷,直到key的下乙個元素不是數字時,將integer.p...
棧實現綜合計算器(中綴表示式)
1.通過乙個index值 索引 來遍歷我們的表示式 2.如果發現是乙個數字,直接入棧 3.如果發現掃瞄到的是乙個符號,就分下面情況 1 如果發現當前的符號棧為空,就直接入棧 2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,就需要從數棧中pop出兩個數,再從符號...
棧實現綜合計算器 中綴表示式
棧 計算器 運算 思路 自己定義符號優先順序 priority 判斷是否為符號 isoper 進行運算 cal 需要兩個棧 數棧 符號棧 定義需要的相關變數 index num1 num2 res oper ch 分解表示式 判斷當前字元 是 數字 還是 符號 7.1 如果是數字,直接壓入數棧中 7...