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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

四则运算算法实现(java)

發布時間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四则运算算法实现(java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

是一道筆試題,這道題居然被分為簡單題。我是覺得真不簡單,還是能力太差。
看了解析后,知道要用幾個關鍵點:

  • 用到棧,先進后出
  • 用到遞歸,遇到做括號就遞歸
  • 減法當成加負數處理
  • 遇到乘除出棧計算后再入棧,棧中只有加法
  • 但是看完別人的分析,知道了要用什么東西,依然覺得很難,太多細節要處理了,花了整整一晚上才寫出來,也不知道有沒有bug。

    要求

    運算包括加減乘除和括號“()”、"[]"和“{}”(這里括號其實沒有區別的,只是方便我們看而已)。還有負數。要求計算值。這個就不屬于簡單四則運算了,算復雜的了。當然,這里為了簡化運算,保證所有數字都為整數,所以我全部用的int類型。

    實現

    import java.util.Arrays; import java.util.Stack;public class Main {public static void main(String[] args) {char[] charArr = "3+2*{1+2*[-4/(8-6)+7]}".toCharArray(); // char[] charArr = {'(','-','1', '2', '/', '-','2',')','-','2'}; // // char[] charArr = {'-','1', '2', '/', '-','2', '/', '-','2'};//System.out.println(cal(charArr)[0]);}/*** @author lsjweiyi* @date 2021/8/19* 計算的主要實現方法*/public static int[] cal(char[] charArr) {int sum = 0; // 和int len = charArr.length;Stack<Integer> stack = new Stack<>(); // 棧int i = 0; // 因為要利用i來計算以此遞歸處理了多少個字符,所以放到外面來定義for (; i < charArr.length; i++) {// result記錄兩個數據,result[0]是本次遞歸處理的數的和。result[1]是本次遞歸處理了多少個字符int[] result;if (charArr[i] == ')' || charArr[i] == ']' || charArr[i] == '}') { // 遇到右括號說明本次遞歸結束break;} else if (charArr[i] == '(' || charArr[i] == '[' || charArr[i] == '{') {//遇到左括號就進入新的遞歸// 遞歸,入參是當前字符+1到末尾。因為并不知道右括號在什么位置,所以直接取到末尾result = cal(Arrays.copyOfRange(charArr, i + 1, len));stack.push(result[0]);// 講一組括號內計算的值入棧i += result[1]; // 遞歸是處理了一批字符的,所以下次處理是當前位置加上遞歸處理的字符長度,繼續處理} else if (charArr[i] >= '0' && charArr[i] <= '9') { //遇到數字的處理// 因為字符數組存儲的是單個數字,而真正的數字肯定有好幾位數,所以需要講連續的幾個數字字符合并成一個整數result = findNum(i, charArr);stack.push(result[0]); //取到數字先入棧i += result[1] - 1;} else {// 獲取運算符后面的數result = findNum(i + 1, charArr);int tempI=i; // 后面的i可能會變動,所以要記錄下當前值if (result[1] == 0) { // 若尋找數字時一個字符都沒運算,則可以確定后面后面跟的是括號i++; //跳過括號result = cal(Arrays.copyOfRange(charArr, i + 1, len));//是括號則遞歸求值}if (charArr[tempI] == '*') {int number1 = stack.pop(); // 遇到乘除要先出棧,與后面的數字計算完再次入棧,因為棧中只存儲加法運算int number2 = result[0];stack.push(number1 * number2);// 計算完在入棧} else if (charArr[tempI] == '/') {int number1 = stack.pop();int number2 = result[0];stack.push(number1 / number2);} else if (charArr[tempI] == '-') {stack.push(-result[0]); // 減法相當于加負數} else if (charArr[tempI] == '+') {stack.push(result[0]);}i += result[1]; // 確定當前運算到什么位置了}}//將棧中數字求和while (!stack.empty()) {sum += stack.pop();}return new int[]{sum, i + 1};// 第一個數是當前棧中的和,第二個數字是本次遞歸處理的字符數}/*** @author lsjweiyi* @date 2021/8/19* 整合連續幾個字符數字為一個完整的整數*/public static int[] findNum(int index, char[] charArr) {int i = index;int fuHaoWei = 1; // 可能會遇到負數,所以最終要乘以符號位,默認為1,即正整數// 判斷是否為負數if (charArr[i] == '-') {fuHaoWei *= -1; //若為負數則符號位=-1i++; // 此時處理了一個“-”,也要記得加1}// 計算連續數字的長度,找到這個范圍for (; i < charArr.length; i++) {// 當遇到超出數字字符范圍的字符,即連續數字結束if (charArr[i] < '0' || charArr[i] > '9') {break;}}if (fuHaoWei == -1) {//輸出還是上面那個result數組。負數因為多了個“-”開頭,所以index + 1return new int[]{fuHaoWei * pinShuzi(Arrays.copyOfRange(charArr, index + 1, i)), i - index};} else {return new int[]{pinShuzi(Arrays.copyOfRange(charArr, index, i)), i - index};}}/*** @author lsjweiyi* @date 2021/8/19* 將連續數字拼接成一個真正的整數,這里用位運算可能更優雅*/public static int pinShuzi(char[] charArr) {int sum = 0;int radix = 1; // 從個位數算起,默認為1for (int i = charArr.length - 1; i >= 0; i--) {sum += Integer.parseInt(String.valueOf(charArr[i])) * radix;radix *= 10; // 每前進一位,要乘10.}return sum;} }

    說實在的,即使我加了很多注釋,但是別人看起來估計還是很費勁,最好的辦法還是按照思路自己寫一遍。兩個小時內能寫出完整的就很不錯了。所以筆試題分類到簡單題我不太理解。

    代碼還有可改進地方,但是這代碼折騰我辛苦了,懶得優化了。

    總結

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

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