(學習java)利用順序棧簡易計算器的編寫
import java.util.Arrays; import java.util.Scanner; //簡易計算器的編寫 //中綴表示式轉字尾表示式 ,得出結果用於逆波蘭數輸出 //例如 輸入:(11+2.2)*3.1+(30*45)-((1.1+23)*3.3)/5.2 //轉換成字尾表示式: 11 2.2 + 3.1 * 30 45 * + 1.1 23 + 3.3 * 5.2 / - //輸出結果:1375.6257692307693 public class TurnRPN { public static void main(String[] args) { char[] s = getChar(); String expression = getExpression(s); System.out.print("轉換成字尾表示式: "); System.out.println(expression); //將字串轉換成字元陣列 char[] s2 = expression.toCharArray(); ArrStack as = rpn(s2); System.out.print("輸出結果:"); as.listStack(); } // 將輸入的字串轉換成字元陣列 public static char[] getChar() { Scanner sc = new Scanner(System.in); // 將輸入的字串轉換成一個字元陣列 System.out.println("請輸入中綴表示式(請不要輸入空格): "); char[] s = sc.nextLine().toCharArray(); return s; } // 中綴表示式轉字尾表示式 public static String getExpression(char[] s) { ArrStack as = new ArrStack(); // 建立字串儲存字尾表示式 String arr = ""; for (int i = 0; i < s.length; i++) { // 如果是數字或者.直接放入字串中 if (isNumber(s[i]) || s[i] == '.') { arr = arr + s[i]; // 判斷數字是否完全輸入,如果全部輸入完畢,則在後面加上空格 if (i != s.length - 1) { if (!isNumber(s[i + 1]) && s[i + 1] != '.') { arr = arr + " "; } } else { // 如果字元的最後一位是數字,則直接加空格(與最後出棧的運算子字元區分) arr = arr + " "; } // 如果是運算子字元,則判斷後入棧 } else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') { // 如果是= -則判斷棧頂元素是否為 * / 如果是,先將棧頂元素出棧後再入棧 否則,直接入棧 if (s[i] == '+' || s[i] == '-') { if (!as.isEmpty()) { // 判斷棧是否為空 char r = as.getTop(); while (r == '+' || r == '-' || r == '*' || r == '/') { r = as.stackPop(); arr = arr + r + " "; // 如果棧為空,則直接跳出迴圈 if (!as.isEmpty()) { r = as.getTop(); } else { break; } } } as.stackPush(s[i]); } else { as.stackPush(s[i]); } // 如果字元是(直接入棧,如果)則棧頂元素依次出棧,直到出棧元素是(為止 } else if (s[i] == '(') { as.stackPush(s[i]); } else if (s[i] == ')') { char r = as.stackPop(); while (r != '(') { arr = arr + r + " "; r = as.stackPop(); } } } // 將棧中剩餘的元素依次存入字串中 while (!as.isEmpty()) { char r = as.stackPop(); arr = arr + r + " "; } return arr; } // 逆波蘭表示式求值 public static ArrStack rpn(char[] s) { ArrStack as = new ArrStack(); double num = 0; // 定義空字串存入字元 String arr = ""; double a = 0; double b = 0; double result = 0; for (int i = 0; i < s.length; i++) { // 如果是數字或者.則推入棧中 if (isNumber(s[i]) || s[i] == '.') { arr = arr + s[i]; } else if (s[i] == ' ') { // 遇到空格,將資料取出轉成double型別推入棧中 if (arr == "") { continue; } else { num = Double.valueOf(arr); as.stackPush(num); // 字串置空 arr = ""; } } else { // 遇到運算子字元,彈出棧頂前兩個數進行運算後再壓入棧中 switch (s[i]) { case '+': a = as.stackPop(); b = as.stackPop(); result = b + a; as.stackPush(result); break; case '-': a = as.stackPop(); b = as.stackPop(); result = b - a; as.stackPush(result); break; case '*': a = as.stackPop(); b = as.stackPop(); result = b * a; as.stackPush(result); break; case '/': a = as.stackPop(); b = as.stackPop(); if (a == 0) { System.out.println("除數不能為0!"); break; } result = b / a; as.stackPush(result); break; } } } return as; } // 判斷字元是否為數字 public static boolean isNumber(char c) { if (c >= 48 && c <= 57) { return true; } return false; } // 建立順序棧 public static class ArrStack { // 定義陣列儲存元素 private Object[] elementData; // 定義棧的當前長度 private int size; // 定義棧的當前容量 private int capacity; // 定義棧頂 public int top; // 初始化,預設建立一個容量為50的陣列 public ArrStack() { elementData = new Object[50]; capacity = 50; } // 初始化,自定義容量陣列 public ArrStack(int n) { elementData = new Object[n]; capacity = n; } // 入棧 public <T> void stackPush(T data) { // 如果容量滿了,則新建一個數組擴充容量 if (size >= capacity) { int newLength = (capacity * 3 / 2) + 1; elementData = Arrays.copyOf(elementData, newLength); capacity = newLength; } elementData[top] = data; top++; size++; } // 出棧 public <T> T stackPop() { if (size == 0) { System.out.println("當前為空棧"); return null; } else { T data = (T) this.elementData[top - 1]; top--; size--; return data; } } // 遍歷棧 public void listStack() { if (size == 0) { System.out.println("空棧"); } else if (size == 1) { System.out.println(elementData[top - 1]); // System.out.println("棧的長度" + size); } else { for (int i = 0; i < size; i++) { System.out.print(elementData[i] + " "); } System.out.println("棧的長度" + size); } } // 返回當前容量 public void capacity() { System.out.println("當前最大容量" + capacity); } // 返回當前棧頂的值 public <T> T getTop() { T data = (T) elementData[top - 1]; return data; } // 判空 public boolean isEmpty() { return size == 0; } } }
相關推薦
(學習java)利用順序棧簡易計算器的編寫
import java.util.Arrays; import java.util.Scanner; //簡易計算器的編寫 //中綴表示式轉字尾表示式 ,得出結果用於逆波蘭數輸出 //例如 輸入:(11+2.2)*3.1+(30*45)-((1.1+23)*3.3)
Java的順序棧和鏈式棧
urn implement public 可能 object 指定大小 常數 額外 異常 棧的定義 棧是限制在表的一段進行插入和刪除的運算的線性表,通常能夠將插入、刪除的一端為棧頂,例外一端稱為棧底,當表中沒有任何元素的時候稱為空棧。 通常刪除(又稱“退棧”)叫做彈出pop
java script 指令碼的簡易計算器
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>簡易計算器</title> </head> <body>
利用順序棧判斷字串是否迴文
/*程式的版權和版本宣告部分: *Copyright(c)2014,煙臺大學計算機學院學生 *All rights reserved. *檔名稱: *作者:田成琳 *完成日期:2014 年 9 月 1
順序棧應用2(利用順序棧將中綴式轉換成前、字尾式並求值)
/* 中綴轉字首參考演算法: 1)求輸入串的逆序。(中綴轉字首是從右向左訪問表示式) 2)檢查輸入的下一元素。 3)假如是運算元,把它新增到輸出串中。 4)假如是閉括號,將它壓棧。 5)假如是運算子, i)假如棧空,此運算子入棧。 ii)假如棧頂是閉括號,此運算子入棧。 i
c++利用順序棧解決括號匹配問題
already 括號匹配問題 是否 data ems else if alt 問題 http 題目: 7-1 括號匹配 (30 分) 給定一串字符,不超過100個字符,可能包括括號、數字、字母、標點符號、空格,編程檢查這
java棧實現簡易計算器算法
return string 計算 bsp emp java棧 ava empty pan 問題描述: 對於任意字符串,包含+ - * /和括號, 求出該表達式的值 首先百度該問題,網上有不少答案,但是實際思考,發現,很多答案沒有考慮完全,例如: -1+(-2)*3
JAVA(利用jsp+javabean+servlet)實現簡易計算器
splay value static parse gen title private spl pen 代碼解釋基本都在代碼中給出 1 <%@ page language="java" contentType="text/html; charset=UTF-
Java程式設計 圖形使用者介面 小巫版簡易計算器
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
java——利用生產者消費者模式思想實現簡易版handler機制
參考教程:http://www.sohu.com/a/237792762_659256 首先介紹每一個類: 1.Message: 這個類的作用是儲存一個生產者生產出來的具體的訊息,就類似連結串列佇列中的一個節點,自行定義需要儲存的內容。 code:訊息要執行的具體動作程式碼 msg:訊息
java學習:Java程式碼編寫規範對開發的重要性
本文從Java程式碼編寫的初期到結尾,做了一次整體的總結,希望對初學者有幫助。 一個錯誤的命名會很誤導人,不良的命名,對於閱讀程式碼的人來說很糾結。一個良好的命名對自己也有很大的幫助。 我個人命名的變數都比較長,一般是單詞的全稱,這樣程式碼讀起來易懂,有些縮寫你根本不知道它代表的單詞是
java-簡易計算器設計
用java寫一個簡易的計算器 執行結果如圖所示,輸入四則運算表示式,右下角顯示結果。 專案原始檔 https://download.csdn.net/download/kuangpeng1956/10791222 屬性及方法清單 屬性清單 JTextArea topArea
Java利用JNI呼叫c++程式碼簡易例子演示
點選開啟連結 (提取碼:8676) 一、首先簡單交代一下兩個問題: 1.什麼是JNI - - - JNI的全名為Java Native Inter
Java程式碼實現順序棧和鏈式棧
Java程式碼實現順序棧和鏈式棧 棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入或者刪除運算。後進先出(Last In First Out)。 棧中的資料操作主要有push(壓入)和pop(彈出)操作。 實際上,棧就可以用陣列來實現,也可
從簡易計算器學習Android開發
初學Android移動開發,先從一個簡單的專案開始——簡易計算器。 前言: 如果你在Android studio配置方面有什麼錯誤,可以參考我的其他部落格。這裡只是寫一下我作為一個初學者的開發筆記,總結自己的得失,為以後的開發打基礎。對你有幫助的地方請自取。 目錄 前言: 開
利用matlab guide製作簡易計算器
前言: 當然了這個太簡單了,新手可以借鑑一下,舉一反三的話還可以新增一些功能或者簡潔一些。比如下拉框啊之類的 而且呢,這個你弄明白了,所有運算有關的,輸入輸出有關的,都大致相同。 實現過程 先是一個個的新增。漫長的過程~~ 下面圖錯了,最右邊應該新增text而不是edit,我
利用二維陣列建立動態下拉選單&購物簡易計算器
1.利用二維陣列建立動態下拉選單 <!doctype html> <html> <head> <meta charset="utf-8"> <title>實戰</title> <scr
【MongoDb學習之路】Java利用MongoClient類連線MongoDB資料庫
專案需要 mongo-java-driver-3.0.2 .jar 【重點看加粗字型,方法體中註釋的都是系統連線引數】 package cn.com.mongodb; import com.mongodb.DB; import com.mongodb.DBColl
學習java使用陣列編寫學生管理系統
我學習了陣列的使用。陣列可以把一些相同型別的元素儲存起來,並且很容易讀取。利用陣列,我們就可以製作一個簡單的學生管理系統,可以記錄學生的姓名,年齡,成績。 陣列的長度是不變的,必須一開始就定義好。但是我發現java的陣列和c語言的陣列在建立的時候有所不同。C語言的陣列在建立
[Java]利用棧判斷括號是否完整配對
利用棧實現判斷字串中的括號是否都是配對的。 主要演算法是依次讀取字串中的每一個字元,如果是左括號則將左括號壓入棧中,如果是右括號則從棧中彈出最上面的字元,若兩者不是同種括號或棧內已經沒有字元就返回false,迴圈完成後返回true。 package com.exampl