1. 程式人生 > >(Java語言)用棧實現的支援括號的四則運算計算器

(Java語言)用棧實現的支援括號的四則運算計算器

小需求:編寫一個簡單的計算器,該計算器目前只需要支援單位正整數的加、減、乘、除運算,並支援用括號表示優先級別。和我們小
學時學過的算術規則一致,乘法和除法的優先順序一樣,加法和減法的優先順序一樣。乘除法的優先順序高於加減法。括號的優先順序
最高。同一優先順序的運算順序為自左向右。要求提供一個名為eval的API,輸入字串型別的表示式,輸出整數型別的運算結果。

實現思路:

將運算表示式(中綴)轉換成字尾表示式,並用棧計算結果,處理步驟:

一、解析輸入的運算表示式中的運算元和運算子,並按照原有順序存於一個數組,結果這個數組裡存的是中綴表示式

二、將步驟一的中綴表示式結果轉成字尾表示式,需要設定一個棧來臨時存放運算子,處理步驟是:

為運算子定義優先順序:(   +   -   *   / 

                                   0   1   1   2   2  

從原表示式求字尾式的規則為:

1.設定運算子棧

2.掃描表示式,若當前字元是運算元,則直接傳送給字尾表示式;

3.若當前字元為運算子且優先順序大於棧頂運算子,則進棧,否則退出棧頂運算子並將其傳送給字尾式。然後將當前運算子放入棧中。

4.若掃描完表示式,則將棧中的全部運算子依次傳送給字尾式。

5.若當前字元為"(",進棧。

6.若當前字元為")",則從棧頂起,依次將棧中運算子出棧傳送給ie字尾式,直到碰到"("。將棧中"("出棧,不需要傳送給字尾式。然後繼續掃描表示式。

三、根據字尾表示式計算結果,也要設定一個棧用於臨時存放運算元,處理步驟是:

1、掃描表示式,若當前字元是運算元,則進棧

2、若當前字元為運算子,則取兩次棧頂的運算元,第一次取棧頂運算元作為運算子後面的運算元,第二次取棧頂運算元作為運算子前面的運算元,計算所組成表示式的結果,然後將結果進棧

3、若掃描完表示式,則存於棧頂的就是最終的結果。

import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * Created by neo on 2018/3/27.
*/ public class Calculator { public static int eval(String expression) { List<CalcItem> middleExpression = initCalcExpression(expression); List<CalcItem> postfixExpression = transferToPostfixExpression(middleExpression); return evaluatePostfixExpression(postfixExpression); } private static List<CalcItem> initCalcExpression(String expression) { List<CalcItem> result = new ArrayList<>(); for (int i = 0; i < expression.length(); i++) { String item = expression.substring(i, i + 1); if (Operator.isOperator(item)) { result.add(new Operator(item)); else if (Number.isNumber(item)) { result.add(new Number(item)); } } return result; } private static List<CalcItem> transferToPostfixExpression(List<CalcItem> middleExpression) { List<CalcItem> result = new ArrayList<>(); Stack<CalcItem> calcStack = new Stack<>(); for (CalcItem aMiddleExpression : middleExpression) { aMiddleExpression.postfixTransfer(result, calcStack); } while (!calcStack.empty()) { result.add(calcStack.pop()); } return result; } private static int evaluatePostfixExpression(List<CalcItem> postfixExpression) { Integer numLeft, numberRight, result; Stack<Number> numberStack = new Stack<>(); for (CalcItem item : postfixExpression) { if (item instanceof Number) { numberStack.push((Number) item); else { numberRight = numberStack.pop().value(); numLeft = numberStack.pop().value(); result = ((Operator) item).calc(numLeft, numberRight); numberStack.push(new Number(result.toString())); }

相關推薦

Java語言實現支援括號四則運算計算器

小需求:編寫一個簡單的計算器,該計算器目前只需要支援單位正整數的加、減、乘、除運算,並支援用括號表示優先級別。和我們小 學時學過的算術規則一致,乘法和除法的優先順序一樣,加法和減法的優先順

資料結構c語言——鏈儲存結構及實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。   不多bibi你們都懂哈,直接上程式碼:  鏈棧結構: typedef struct Stock

遞迴實現1到100的和、10的階乘Java語言

遞迴需慎用。 package demo; public class Test { public static void main(String[] args) { Sys

的應用--四則運算表示式求值java語言

棧的應用–四則運算表示式求值(java語言) 前言 在複習資料結構的過程中,採用單鏈表實現了棧Stack,具體功能有如下幾個功能:判斷其是否為空棧、輸出棧的長度、入棧、出棧並且實現Iterable藉口,可以採用Iterator遍歷棧。在測試了棧之後,覺得應該

PAT刷題 Java語言

group ron asn extra rms cas should 語言 () 1001. A+B Format (20) 時間限制 400 ms 內存限制 65536 kB 代碼長度限制 16000 B 判題程序 Standard 作者 CHEN, Y

P1422小玉家的電費JAVA語言

package 順序與分支; /* * 題目描述 夏天到了,各家各戶的用電量都增加了許多,相應的電費也交的更多了。 小玉家今天收到了一份電費通知單。小玉看到上面寫:據閩價電[2006]27號規定, 月用電量在150千瓦時及以下部分按每千瓦時0.4463元執行, 月用電量在151~400千瓦時的

P1423_小玉在游泳JAVA語言

 題目描述 小玉開心的在游泳,可是她很快難過的發現,自己的力氣不夠,游泳好累哦。 已知小玉第一步能遊2米,可是隨著越來越累,力氣越來越小, 她接下來的每一步都只能游出上一步距離的98%。 現在小玉想知道,如果要游到距離x米的地方,她需要遊多少步呢。 請你程式設計解決這個問題。 輸入輸出

P1008_三連擊JAVA語言

/*  * 題目描述 將1,2,⋯,9共9個數分成3組, 分別組成3個三位數,且使這3個三位數構成1:2:3的比例,試求出所有滿足條件的3個三位數。 輸入輸出格式 輸入格式: 木有輸入 輸出格式: 若干行,每行3個數字。按照每行第1個數字升序排列。  */ publi

P1200_你的飛碟在這兒JAVA語言

題目描述 眾所周知,在每一個彗星後都有一隻UFO。這些UFO時常來收集地球上的忠誠支持者。 不幸的是,他們的飛碟每次出行都只能帶上一組支持者。因此,他們要用一種聰明的方案讓這些小組提前知道誰會被彗星帶走。 他們為每個彗星起了一個名字,通過這些名字來決定這個小組是不是被帶走的那個特定的小組(你認為是誰

大資料教程9.5MR實現sql中的jion邏輯

        上一篇部落格講解了使用jar -jar的方式來執行提交MR程式,以及通過修改YarnRunner的原始碼來實現MR的windows開發環境提交到叢集的方式。本篇博主將分享sql中常見的join操作。   &nbs

AKKA文件java——例與部署場景

我如何使用與部署akka? 有兩種不同的使用akka的方式: 作為一個庫:作為一個web應用的類路徑下的普通JAR使用,將它放在WEB-INF/lib。 在一上主類中通過例項化ActorSystem作為一個獨立的應用執行,或使用微核心(Scala) / 將akka作為一個庫使用 如果你在

支付寶第三方介面對接JAVA語言

alipay 的幾個核心功能檔案: ====================================================================================================== AlipayFunctio

c語言實現括號運算的簡單計算器

c語言用棧實現帶括號的簡單計算器 寫的簡單,棧部分實現比較粗略,可能有沒考慮到的地方 目錄 整體步驟分為三步: 1.棧的簡單實現 2.中綴轉換為字尾 3.字尾運算 1.棧的簡單實現 typedef struct sta

劍指offer-替換空格java語言

import java.util.Scanner; public class ReplaceBlack { public static String replaceBlack(String[] str){ String s=""; int i; for( i=0;i<str.l

設計模式簡單介紹Java語言-- 工廠方法模式

設計模式簡單介紹(Java語言) – 工廠方法模式 1.工廠方法模式的定義: 工廠方法模式(FACTORY METHOD)是一種常用的物件建立型設計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦

設計模式簡單介紹java語言-- 模板方法模式

設計模式簡單介紹(java語言)– 模板方法模式 模板方法模式的定義 模板方法模式:定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 類圖: 類圖中,Abstrac

求最大公約數和最小公倍數java語言

package com.sun.maxCommonDivisorAndminCommonMultiple; /** * * @author:孫創 * @date:2017年4月10日 * @Discription://求最大公約數和最小公倍數 */ publi

設計模式簡單介紹java語言-- 建造者模式

設計模式簡單介紹(java語言)– 建造者模式 1. 建造者模式的定義 建造者模式也叫做生成器模式,其定義如下: 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 通用類圖: 在建造者模中,通常有如下4個角色:

C語言實現四則運算

要注意對情況的分類。#include <stdio.h> #include <stdlib.h> #define OK 10000001 #define ERROR 10000002 struct node { int data;

設計模式Java語言-單例模式

  單例模式,簡而言之就是在整個應用程式裡面有且僅有一個例項,在程式的任何時候,任何地方獲取到的該物件都是同一個物件。單例模式解決了一個全域性的類被頻繁建立和銷燬的,或者每次建立或銷燬都需要消耗大量cpu資源的物件的問題。單例模式總的可以分為懶漢模式和餓漢模式,顧名思義,懶漢模式是一個非常懶的漢子,只要你沒有