1. 程式人生 > >(學習java)利用順序棧簡易計算器的編寫

(學習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