1. 程式人生 > >JAVA對只含有乘與加的表示式計算

JAVA對只含有乘與加的表示式計算

題目來源2018.4.25拼多多後端開發實習筆試:

題目簡化描述:對於只含有+與*的表示式進行,按“順序”計算【從左往右依次計算】以及按照“正常”方式計算。

例如:1*1+2*2

按照順序計算=6.

按正常方式計算=5

程式碼如下:

主程式:

public static void main(String[] arg){

    String opeStr="1+2*3*4+5";

    char[ ] opeStrChar=opestr.toCharArry();

    int orderResult=orderCal();  // 順序計算

    int normalResult=normalCal();// 正常計算

}

    // 順序計算
    public static int orderCal(char[] opeStr)
    {
    // 如果只有一個值,則直接返回值。如表示式為1,則直接返回運算結果1.
        if (opeStr.length == 0)
        {
    // 減去48是為了將字元值轉化為整數值
            return opeStr[0] - 48;
        }

        Stack<Integer> stack = new Stack<>();
    // 將第一個值進棧
        stack.push(opeStr[0] - 48);


        // 迴圈從i=1開始,因為i=0時將會導致opeStr[i - 1]陣列越界。
        for (int i = 1; i < opeStr.length; i++)
        {
  // i%2==0表示:opeStr[i]是數字而不是運算子號
            if (i % 2 == 0)
            {
  // 將數值入棧
                stack.push(opeStr[i] - 48);
    // opeStr[i - 1]:判斷該數值前一位的符號是什麼
                if (opeStr[i - 1] == '*')
                {

    // 將*號前後的資料出棧,並相乘,將乘積入棧
                    stack.push(stack.pop() * stack.pop());
                }
                else
                {
  // 將+號前後的資料出棧,並相加,將求和結果入棧
                    stack.push(stack.pop() + stack.pop());
                }
            }
        }
    // 最終棧內只有一個值,這個值就是最終的求和結果
        return stack.pop();
    }


    // 正常計算,思路是:將乘法先計算,將加法資料壓到棧中最後進行統一計算。
    public static int normalCal(char[] opeStr)
    {
        if (opeStr.length == 1)
        {
            return opeStr[0] - 48;
        }

        Stack<Integer> stack = new Stack<>();
        stack.push(opeStr[0] - 48);

        for (int i = 1; i < opeStr.length; i++)
        {
            if (i % 2 == 0)
            {
                stack.push(opeStr[i] - 48);
                if (opeStr[i - 1] == '*')
                {
        // 將乘法左右的資料出棧,並求乘積,並將結果入棧
                    stack.push(stack.pop() * stack.pop());
                }
            }
        }

        int sum = 0;
    // 遍歷stack,棧內的元素都是待加的元素,累加,即可求得最終值
        for (Integer integer : stack)
        {
            sum += integer;
        }
        return sum;
    }
}

相關推薦

JAVA含有表示式計算

題目來源2018.4.25拼多多後端開發實習筆試:題目簡化描述:對於只含有+與*的表示式進行,按“順序”計算【從左往右依次計算】以及按照“正常”方式計算。例如:1*1+2*2按照順序計算=6.按正常方式計算=5程式碼如下:主程式:public static void main

java象創建內存模型總結

對象的引用 創建 生命周期 運行時 強制 地址 class文件 發生 停止 1、JVM管轄的內存大致分為三個邏輯部分:java棧(Heap)、java堆(JavaStack)和方法區(MethodArea)。在JVM啟動時創建,關閉時全部回收。      棧、本地方法棧、

Java象的認識理解

創建類型 鞏固 當我 com 編寫 回收 jpg 回收機制 span   今天是我學習編程以來第一次寫博客,記下平日學習所得,本來這幾日都在學習web框架 但覺得梳理一下之前所學很有必要。畢竟之前學習Java感覺很粗略只是以考試為目的。所以就以《Thinking in

java時間進行天數的

/** * 對日期進行加減操作 * @param date 要進行加減天數的日期 * @param addOrMinus 對日期加減天數(eg:加一天:1 減一天:-1) * @return * @throws ParseException */ public static

java日期Date類進行減運算、年份減,月份

日期比較:簡單的比較可以以字串的形式直接比較,也可使用java.sql.Date.valueOf("2007-03-08").compareTo(java.sql.Date.valueOf("2007-03-18")) 方式來比較日期的大小.也可使用java.util.Date.after(java.util

淺談Java 7的閉包Lambda表示式之優劣

前幾天Oracle推出了Java 7官方的閉包與Lambda表示式的第一個實現,這基本上也是最終在正式版中的樣式了。看了這個實現之後,我的第一感覺便是“醜”,當然不排除這是因為看慣了其他語言中實現的緣故。後來再仔細看了看又想了想,發現Java 7的實現也並非毫無可取之處,但似乎又感到某些做法上有一些問

演算法題:含有0,1,2三個元素的陣列排序,時間複雜度O(n)

題目: 將元素均為0、1、2的陣列排序,時間複雜度O(n)。 思路: 方法1:通過三個下標遍歷一遍實現的方法。 p1從左側開始,指向第一個非1的數字;p3從右側開始,指向第一個非3的數字。 p2從p1開始遍歷,如果是2,p2繼續遍歷,直到p2遇到1或者3 如果遇到

Java日期Date類進行減運算,年份減,月份

Date d=new Date(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); System.out.println("今天的日期:"+df.format(d)); S

Java日期Date類進行減運算,年月日,時分秒

第一種,知道日期,如2018051109144                String str=txnTime;                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");/

JAVA字串的壓縮解壓縮

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStre

Java字串的壓縮解壓

package com.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.uti

javaLinux系統的CPU利用率的計算和記憶體資訊的獲取

       程序檔案系統,procfs,是一個偽檔案系統,它允許對一些非傳統意義上的檔案通過標準檔案I/O介面進行訪問。procfs將Solaris核心程序架構進行了抽象,當前系統中所有執行著的程序會在/proc/目錄下有所體現。/proc/目錄下的物件不是真實磁碟檔案,這

javamap象相互轉換

map對象 spa tac 互轉 pro != ces getclass ash 1 /** 2 * 使用org.apache.commons.beanutils進行轉換 3 */ 4 class A { 5

java的單例設計模式(象的延時載)考試專用

clas pac ack 延時加載 專用 public get private static java的單例設計模式(對象的延時加載) ,稱為:懶漢式 考試專用例:package day6;public class Single2 { //考試專用 ,對象的延時加

JsonJson字符串的轉化、JSON字符串Java象的轉換

debug pos type 需要 collect ie8 rst toc fire Json對象與Json字符串的轉化、JSON字符串與Java對象的轉換 一.Json對象與Json字符串的轉化 1.jQuery插件支持的轉換方式:   $.parseJSON( json

JavaJSON互相轉換jsonlib以及手動創建JSON數組——(二)

ring lnl tft sem mkf ted family sae key     首先聲明一下,jsonlib轉換與GSON相比太差勁了,操作不是一般的繁瑣。GSON可以直接轉換成各種集合與對象類型。強烈推薦使用GSON。而且GSON一個方法就可以解決,

javajson象之間的轉換

字符 class new jar包 lib num round word out jar包:import net.sf.json.JSONObject; 1.解析json字符串 將json字符串轉換為json對象,然後再解析json對象:。JSONObjectjsonObj

轉-Java基礎深入解析——類

不同的 共享數據 style 使用 內容 類型 取出 作用 system 轉自CSDN博客,u010425776,http://m.blog.csdn.net/u010425776/article/details/46932867 成員變量與局部變量的區別 1.成員變量定義

01. Java象的序列化反序列化簡介

語音 log -c object height 通訊 圖片 二進制 進程    Java對象的序列化與反序列化 ; 給大家講解一下什麽是序列化 & 反序列化      當兩個進程進行遠程通訊的時候,彼此相互可以發送各種類型的數據,如文本,圖片,語音和視頻等無論是任何

JSONUtil(JAVA象/Listjson互轉,xmljson互轉)

transpose boolean ngs final span arraylist setname clas pro 1 package com.chauvet.utils.json; 2 3 import java.io.BufferedReader;