日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 四则运算 栈的实现

發布時間:2024/1/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 四则运算 栈的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • import?java.util.Stack;??
  • /**???
  • ?*?利用棧,進行四則運算的類???
  • ?*?用兩個棧來實現算符優先,一個棧用來保存需要計算的數據numStack,一個用來保存計算優先符priStack???
  • ?*????
  • ?*?基本算法實現思路為:用當前取得的運算符與priStack棧頂運算符比較優先級:若高于,則因為會先運算,放入棧頂;???
  • ?*?若等于,因為出現在后面,所以會后計算,所以棧頂元素出棧,取出操作數運算;???
  • ?*??若小于,則同理,取出棧頂元素運算,將結果入操作數棧。各個優先級'('?>?'*'?=?'/'?>?'+'?=?'-'?>?')'???
  • ?*????
  • ?*/??????
  • public?class?Operate?{??????
  • ????private?Stack<Character>?priStack?=?new?Stack<Character>();//?操作符棧??????
  • ????private?Stack<Integer>?numStack?=?new?Stack<Integer>();;//?操作數棧??????
  • ??????
  • ????/**???
  • ?????*?傳入需要解析的字符串,返回計算結果(此處因為時間問題,省略合法性驗證)???
  • ?????*?@param?str?需要進行技術的表達式???
  • ?????*?@return?計算結果???
  • ?????*/??????
  • ????public?int?caculate(String?str)?{??????
  • ????????//?1.判斷string當中有沒有非法字符??????
  • ????????String?temp;//?用來臨時存放讀取的字符??????
  • ????????//?2.循環開始解析字符串,當字符串解析完,且符號棧為空時,則計算完成??????
  • ????????StringBuffer?tempNum?=?new?StringBuffer();//?用來臨時存放數字字符串(當為多位數時)??????
  • ????????StringBuffer?string?=?new?StringBuffer().append(str);//?用來保存,提高效率??????
  • ??????
  • ????????while?(string.length()?!=?0)?{??????
  • ????????????temp?=?string.substring(0,?1);??????
  • ????????????string.delete(0,?1);??????
  • ????????????//?判斷temp,當temp為操作符時??????
  • ????????????if?(!isNum(temp))?{??????
  • ????????????????//?1.此時的tempNum內即為需要操作的數,取出數,壓棧,并且清空tempNum??????
  • ????????????????if?(!"".equals(tempNum.toString()))?{??????
  • ????????????????????//?當表達式的第一個符號為括號??????
  • ????????????????????int?num?=?Integer.parseInt(tempNum.toString());??????
  • ????????????????????numStack.push(num);??
  • ????????????????????tempNum.delete(0,?tempNum.length());??????
  • ????????????????}??????
  • ????????????????//?用當前取得的運算符與棧頂運算符比較優先級:若高于,則因為會先運算,放入棧頂;若等于,因為出現在后面,所以會后計算,所以棧頂元素出棧,取出操作數運算;??????
  • ????????????????//?若小于,則同理,取出棧頂元素運算,將結果入操作數棧。??????
  • ??????
  • ????????????????//?判斷當前運算符與棧頂元素優先級,取出元素,進行計算(因為優先級可能小于棧頂元素,還小于第二個元素等等,需要用循環判斷)??????
  • ????????????????while?(!compare(temp.charAt(0))?&&?(!priStack.empty()))?{???
  • ????????????????????int?a?=?(int)?numStack.pop();//?第二個運算數??????
  • ????????????????????int?b?=?(int)?numStack.pop();//?第一個運算數??????
  • ????????????????????char?ope?=?priStack.pop();??????
  • ????????????????????int?result?=?0;//?運算結果??????
  • ????????????????????switch?(ope)?{??????
  • ????????????????????//?如果是加號或者減號,則??????
  • ????????????????????case?'+':??????
  • ????????????????????????result?=?b?+?a;??????
  • ????????????????????????//?將操作結果放入操作數棧??????
  • ????????????????????????numStack.push(result);??????
  • ????????????????????????break;??????
  • ????????????????????case?'-':??????
  • ????????????????????????result?=?b?-?a;??????
  • ????????????????????????//?將操作結果放入操作數棧??????
  • ????????????????????????numStack.push(result);??????
  • ????????????????????????break;??????
  • ????????????????????case?'*':??????
  • ????????????????????????result?=?b?*?a;??????
  • ????????????????????????//?將操作結果放入操作數棧??????
  • ????????????????????????numStack.push(result);??????
  • ????????????????????????break;??????
  • ????????????????????case?'/':??????
  • ????????????????????????result?=?b?/?a;//?將操作結果放入操作數棧??????
  • ????????????????????????numStack.push(result);??????
  • ????????????????????????break;??????
  • ????????????????????}??????
  • ??????
  • ????????????????}??????
  • ????????????????//?判斷當前運算符與棧頂元素優先級,?如果高,或者低于平,計算完后,將當前操作符號,放入操作符棧??????
  • ????????????????if?(temp.charAt(0)?!=?'#')?{??????
  • ????????????????????priStack.push(new?Character(temp.charAt(0)));??????
  • ????????????????????if?(temp.charAt(0)?==?')')?{//?當棧頂為'(',而當前元素為')'時,則是括號內以算完,去掉括號??????
  • ????????????????????????priStack.pop();??????
  • ????????????????????????priStack.pop();??????
  • ????????????????????}??????
  • ????????????????}??????
  • ????????????}?else??????
  • ????????????????//?當為非操作符時(數字)??????
  • ????????????????tempNum?=?tempNum.append(temp);//?將讀到的這一位數接到以讀出的數后(當不是個位數的時候)??????
  • ????????}??????
  • ????????return?numStack.pop();??????
  • ????}??????
  • ??????
  • ????/**???
  • ?????*?判斷傳入的字符是不是0-9的數字???
  • ?????*????
  • ?????*?@param?str???
  • ?????*????????????傳入的字符串???
  • ?????*?@return???
  • ?????*/??????
  • ????private?boolean?isNum(String?temp)?{??????
  • ????????return?temp.matches("[0-9]");??????
  • ????}??????
  • ??????
  • ????/**???
  • ?????*?比較當前操作符與棧頂元素操作符優先級,如果比棧頂元素優先級高,則返回true,否則返回false???
  • ?????*????
  • ?????*?@param?str?需要進行比較的字符???
  • ?????*?@return?比較結果?true代表比棧頂元素優先級高,false代表比棧頂元素優先級低???
  • ?????*/??????
  • ????private?boolean?compare(char?str)?{??????
  • ????????if?(priStack.empty())?{??????
  • ????????????//?當為空時,顯然?當前優先級最低,返回高??????
  • ????????????return?true;??????
  • ????????}??????
  • ????????char?last?=?(char)?priStack.lastElement();??????
  • ????????//?如果棧頂為'('顯然,優先級最低,')'不可能為棧頂。??????
  • ????????if?(last?==?'(')?{??????
  • ????????????return?true;??????
  • ????????}??????
  • ????????switch?(str)?{??????
  • ????????case?'#':??????
  • ????????????return?false;//?結束符??????
  • ????????case?'(':??????
  • ????????????//?'('優先級最高,顯然返回true??????
  • ????????????return?true;??????
  • ????????case?')':??????
  • ????????????//?')'優先級最低,??????
  • ????????????return?false;??????
  • ????????case?'*':?{??????
  • ????????????//?'*/'優先級只比'+-'高??????
  • ????????????if?(last?==?'+'?||?last?==?'-')??????
  • ????????????????return?true;??????
  • ????????????else??????
  • ????????????????return?false;??????
  • ????????}??????
  • ????????case?'/':?{??????
  • ????????????if?(last?==?'+'?||?last?==?'-')??????
  • ????????????????return?true;??????
  • ????????????else??????
  • ????????????????return?false;??????
  • ????????}??????
  • ????????????//?'+-'為最低,一直返回false??????
  • ????????case?'+':??????
  • ????????????return?false;??????
  • ????????case?'-':??????
  • ????????????return?false;??????
  • ????????}??????
  • ????????return?true;??????
  • ????}??????
  • ??????
  • ????public?static?void?main(String?args[])?{??????
  • ????????Operate?operate?=?new?Operate();??????
  • ????????int?t?=?operate.caculate("(3+4*(4*10-10/2)#");????????
  • ????????System.out.println(t);??????
  • ????}??????
  • ??????
  • }? ? ??
  • 總結

    以上是生活随笔為你收集整理的java 四则运算 栈的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。