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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 四则混合运算_Java实现四则混合运算代码示例

發(fā)布時(shí)間:2023/12/31 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 四则混合运算_Java实现四则混合运算代码示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用棧來實(shí)現(xiàn),可以處理運(yùn)算優(yōu)先級(jí)。

使用自然四則運(yùn)算表達(dá)式即可,如:4+(3*(3-1)+2)/2。無需把表達(dá)式先轉(zhuǎn)換為逆波蘭等形式。

package com.joshua.cal;

import java.util.collections;

import java.util.hashmap;

import java.util.hashset;

import java.util.linkedlist;

import java.util.list;

import java.util.map;

import java.util.set;

import java.util.stack;

public class calculator {

private final stack numstack = new stack();

private final stack opstack = new stack();

private char currentoperator;

private char opstacktop;

private int i;

private string expression;

@suppresswarnings("rawtypes")

public void exec(string expression) {

try {

clean();

if (expression == null || expression.isempty()) {

throw new illegalargumentexception("blank expression!");

}

this.expression = expression;

opstack.push(terminate_tokens.start_end_mark);

list tokens = tokenizer.exec(expression

+ terminate_tokens.start_end_mark);

for (; i < tokens.size(); i++) {

final object token = tokens.get(i);

if (token instanceof double) {

processoperand((double) token);

} else {

processoperator((char) token);

}

}

} catch (throwable e) {

system.err.println(string.format(

"incorret expression: %s\nerror: %s", expression,

e.getmessage()));

}

}

private void processoperand(final double operand) {

numstack.push(operand);

}

private void processoperator(final char currentoperator) {

this.currentoperator = currentoperator;

this.opstacktop = opstack.peek();

char calmode = calculate_mode.getrule(currentoperator, opstacktop);

switch (calmode) {

case '>':

processstackhigerpriorityoperator();

break;

case '

processstacklowerpriorityoperator();

break;

case '=':

processstackequalpriorityoperator();

break;

default:

break;

}

}

private void processstacklowerpriorityoperator() {

opstack.push(currentoperator);

}

private void processstackhigerpriorityoperator() {

numstack.push(calculate.exec(opstack.pop(), numstack.pop(),

numstack.pop()));

--i; // pointer back to the previous operator.

}

private void processstackequalpriorityoperator() {

if (terminate_tokens.start_end_mark == currentoperator) {

system.out.println(expression + " = " + numstack.peek());

} else if (')' == currentoperator) {

opstack.pop();

}

}

public void clean() {

numstack.clear();

opstack.clear();

i = 0;

}

public static void main(string[] args) {

calculator cal = new calculator();

cal.exec("4+(3*(3-1)+2)/2"); // = 8

cal.exec("4 + (-3 * ( 3 - 1 ) + 2)"); // = 0

cal.exec("4 +-/ (-3 * ( 3 - 1 ) + 2)"); // incorrect expression!

cal.exec("4.5+(3.2+3)/2"); // = 7.6

cal.exec("4.5+(3.2:3)/2"); // incorrect expression!

cal.exec("-4.5+(3.2-3)/2"); // = -4.4

}

}

enum calculate {

instance;

public static double exec(final char operator, final double right,

final double left) {

switch (operator) {

case '+':

return left + right;

case '-':

return left - right;

case '*':

return left * right;

case '/':

return left / right;

default:

throw new illegalargumentexception("unsupported operator: "

+ operator);

}

}

}

enum terminate_tokens {

instance;

public static final char start_end_mark = '#';

private static final map tokens = new hashmap();

static {

// token, token id

tokens.put('+', 0);

tokens.put('-', 1);

tokens.put('*', 2);

tokens.put('/', 3);

tokens.put('(', 4);

tokens.put(')', 5);

tokens.put(start_end_mark, 6);

}

private static set negative_num_sensitive = new hashset();

public static synchronized set getnegativenumsensitivetoken() {

if (negative_num_sensitive.size() == 0) {

negative_num_sensitive.addall(tokens.keyset());

negative_num_sensitive.remove(')');

}

return negative_num_sensitive;

}

public static boolean isterminatetoken(final char token) {

set keys = tokens.keyset();

return keys.contains(token);

}

public static int gettokenid(final char token) {

return tokens.get(token) == null ? -1 : tokens.get(token);

}

public static int gettokensize() {

return tokens.size();

}

}

enum calculate_mode {

instance;

private static char[][] rules = {

// + - * / ( ) #

{ '>', '>', '', '>' }, // +

{ '>', '>', '', '>' }, // -

{ '>', '>', '>', '>', '', '>' }, // *

{ '>', '>', '>', '>', '', '>' }, // /

{ '

{ '>', '>', '>', '>', 'o', '>', '>' }, // )

{ '

};

static {

if (rules.length != terminate_tokens.gettokensize() || rules.length < 1

|| rules[0].length != terminate_tokens.gettokensize()) {

throw new illegalargumentexception("rules matrix is incorrect!");

}

}

public static char getrule(final char currentoperator, final char opstacktop) {

try {

return rules[terminate_tokens.gettokenid(opstacktop)][terminate_tokens

.gettokenid(currentoperator)];

} catch (throwable e) {

throw new runtimeexception("no rules were defined for some token!");

}

}

}

enum tokenizer {

instance;

private static final stringbuilder buffer = new stringbuilder();

private static string clearexpression(string expression) {

return expression.replaceall(" ", "");

}

private static character previous_char;

private static void clean() {

buffer.delete(0, buffer.length());

previous_char = null;

}

private static boolean processnegativenumbers(final string exp,

final int index) {

char c = exp.charat(index);

if (('+' == c || '-' == c)

&& (previous_char == null || terminate_tokens

.getnegativenumsensitivetoken().contains(previous_char))

&& !terminate_tokens.isterminatetoken(exp.charat(index + 1))) {

buffer.append(c);

return true;

}

return false;

}

@suppresswarnings({ "unchecked", "rawtypes" })

public static list> exec(final string expression) {

clean();

string exp = clearexpression(expression);

list result = new linkedlist();

for (int i = 0; i < exp.length(); i++) {

char c = exp.charat(i);

if (terminate_tokens.isterminatetoken(c)) {

if (processnegativenumbers(exp, i))

continue;

if (buffer.length() > 0) {

result.add(double.valueof(buffer.tostring()));

buffer.delete(0, buffer.length());

}

result.add(c);

} else {

buffer.append(c);

}

previous_char = c;

}

return collections.unmodifiablelist(result);

}

}

輸出

4+(3*(3-1)+2)/2 = 8.0

4 + (-3 * ( 3 - 1 ) + 2) = 0.0

4.5+(3.2+3)/2 = 7.6

-4.5+(3.2-3)/2 = -4.4

incorret expression: 4 +-/ (-3 * ( 3 - 1 ) + 2)

error: null

incorret expression: 4.5+(3.2:3)/2

error: for input string: "3.2:3"

總結(jié)

以上就是本文關(guān)于java實(shí)現(xiàn)四則混合運(yùn)算代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以參閱:大話java混合運(yùn)算規(guī)則? 淺談java變量賦值運(yùn)算符及相關(guān)實(shí)例? java大數(shù)字運(yùn)算之biginteger等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)萬仟網(wǎng)網(wǎng)站的支持。

希望與廣大網(wǎng)友互動(dòng)??

點(diǎn)此進(jìn)行留言吧!

總結(jié)

以上是生活随笔為你收集整理的java 四则混合运算_Java实现四则混合运算代码示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。