❶ java如何計算比較復雜的數學計算,比如有括弧同時有+-*/,順序不一定,就是一個運算公式
可以用編譯原理的思想來理解,主要用到數據結構裡面的棧和隊列。
利用棧的後進先出以及運算符號(+-*/(){} )優先順序,對運算符號進行匹配。
分兩個棧,一個是符號棧,一個是數字棧。
棧的每一次pop出一個字元,要進行校驗,如果匹配(符合運算規則)則計算,並保存結果到數據棧。
❷ 字元串形式的表達式如何計算
不知道你用的是C 還是C++
不知道你有沒有寫過計算器的程序 如果寫過的話就好辦了
首先將得到的字元串存到一個字元串數組中 然後遍歷數組 找出括弧的位置 switch case語句懂的吧 然後將括弧里的字元串提取出來再進行遍歷 找出乘法除法的位置並且進行計算 算好以後再計算加減法再算好以後再算括弧外的 同樣的順序 這樣就可以進行計算了
❸ java數據結構對逆波蘭式進行求值運算,並將結果進行輸出
ACM隊的mdd想做一個計算器,但是,他要做的不僅僅是一計算一個A+B的計算器,他想實現隨便輸入一個表達式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。
比如輸入:「1+2/4=」,程序就輸出1.50(結果保留兩位小數)
❹ java怎樣計算一個String類型的數學表達式
只有自己實現一個方法了,先將這類表達式轉換成逆波蘭式表達式,再使用棧進行計算,實現起來是有一定難度的,特別是其中還夾雜著冪、乘、除、括弧等有先後運算順序的運算符。
❺ 輸入一個字元串,包含數字和加(+)、減(-)、乘(*)、除(/)等四則運算符號,要求輸出其計算結果
入一個字元串,包含數字和加(+)、減(-)、乘(*)、除(/)等四則運算符號,符串的四則運算。給出一個字元串,包含0~9的數字和+-*/()的運算符,-僅代表減號不代表負數。
舉例如下:輸入:1+2*(3-4),輸出:-1。思路:分析字元串的合法性, 模擬四則運算規則,按照先括弧後乘除最後加減的順序計算(逆波蘭式)。
(5)逆波蘭式java擴展閱讀:
測試用例:
a.空串
b.一般輸入, 1+2*(3-4)
c.多層括弧嵌套, 1+2*((3-4)+8)
d.非法字元輸入,9+A+8
e.非法計算符號,*-20+5
f.括弧不匹配,1+2*(3-4)(
g.括弧內為空,1+2*()*9
h.除零情況,1+2*6/(3-3)
❻ java後綴表達式實現表達式求值
import java.util.Scanner;
import java.util.Stack;
public class 表達式計算 {
private static Stack<String> num = new Stack<String>();//存後綴表達式
private static Stack<String> sign = new Stack<String>();//存入符號
private static Stack<Integer> result = new Stack<Integer>();//放結果
public static void getGroup(String line){//講字元串轉換為後綴表達式
for(int i=0; i<line.length(); i++){
char c = line.charAt(i);
if((int)c>=48 && (int)c<=57){//當遇到數字的時候,判斷是不是多位數,然後在push進num
int j = i+1;
while(j<line.length() && (line.charAt(j)>=48 && line.charAt(j)<=57)){
j++;
}
num.push(line.substring(i, j));
i = j-1;
}else if(c == '('){//遇到左括弧直接存進num
sign.push(String.valueOf(c));
}else if(c == ')'){//遇到右括弧從sign中pop棧頂元素push到num知道遇到'(',然後再pop掉'('
while(!sign.peek().equals("(")){
num.push(sign.pop());
}
sign.pop();
}else{
int n = 0;
if(!sign.empty()){//如果sign中沒有元素,直接令n = 0
n = getNum(sign.peek().charAt(0));
}
int m = getNum(c);
if(m >= n){//如果當前元素的運算級別比棧頂元素運算級別要高,就直接push進sign
sign.push(String.valueOf(c));
}else{
while(m < n){//如果當前運算運算級別比sign棧頂元素運算級別要低,就將sign棧頂元素pop並且push進num,知道不符合條件
num.push(sign.pop());//輸入例子2*3+6/3的時候,這里一直報錯
if(!sign.empty()){
n = getNum(sign.peek().charAt(0));
}else{
n = 0;
}
}
sign.push(String.valueOf(c));
}
}
}
while(!sign.empty()){
num.push(sign.pop());
}
}
private static int getNum(char c){
int n = 0;
switch(c){
case '+':
case '-':
n = 1;
break;
case '*':
case '/':
n = 2;
break;
}
return n;
}
❼ java 設計演算法,計算用後綴表示法表示的算術表達式的值。
你好!
後綴表達式也稱逆波蘭表達式,其優點就在於可以方便的用棧實現表達式的值的計算。和你說一下思路吧:
·從頭讀入表達式
·如果遇到數則將其壓入棧
·如果遇到運算符,從棧中彈出棧頂連個數,實行相應運算,將結果壓入棧中
·直到表達式尾,此時棧中應該只有一個元素,即運算結果
·Over
如果對你有幫助,望採納。
❽ java整式計算,怎麼實現類似這種效果的,不要中間那個"原式="
把普通的表達式表示成逆波蘭式,然後用堆棧挨個讀取,遇到符號按照符號的定義去取前邊的倆個數字,計算完成將計算結果入棧,然後直到所有符號都運算完。你隨便搜一下堆棧表達式求值。
❾ 用Java寫的計算器的程序!不需要界面!
用java寫的計算器的程序,主要是通過控制台輸入,主要方法是使用scanner類來接收用戶從鍵盤輸入的一個算式,通過分解算式,存入兩個字元串,判斷中間的的符號,進行相應計算,如下代碼:
System.out.println("-----------------------------------");
System.out.println("請輸入一個算術表達式,如:45*23");
Scannerin=newScanner(System.in);//接收用戶從鍵盤輸入的字元
Stringstr=in.nextLine();
StringBufferbuffer=newStringBuffer();//保存左側的數字
StringBufferbuffer1=newStringBuffer();//保存右側的數字
chart='';//保存運算符
for(inti=0;i<str.length();i++){
if(str.charAt(i)=='+'||str.charAt(i)=='-'
||str.charAt(i)=='*'||str.charAt(i)=='/'){
t=str.charAt(i);//識別是什麼運算符
for(intj=i+1;j<str.length();j++){
buffer1.append(str.charAt(j));
}
break;
}else{
buffer.append(str.charAt(i));
}
}
Stringc=buffer.toString();
Stringd=buffer1.toString();
doublea=Double.parseDouble(c);
doubleb=Double.parseDouble(d);
doublesum=0;
if(t=='+'){
sum=a+b;
}
if(t=='-'){
sum=a-b;
}
if(t=='*'){
sum=a*b;
}
if(t=='/'){
sum=a/b;
}
System.out.println("程序運算...");
System.out.println(c+t+d+"="+sum);
System.out.print("-----------------------------------");
運行結果如下:
❿ Java計算字元串中的數學表達式的值演算法怎麼寫
代碼網上很多,只說說演算法吧
12+8/4-5+(3-4)
把這樣的表達式拆成:(操作數)(操作符) 、
12+
8/
4-
5+(
3-
4)
(術語叫做逆波蘭式)
默認的計算順序是從左往右,記為left。另設從右往左,記為right
設計Element類,具有 操作數 operant, 操作符operator, 操作順序 order三個屬性
用兩個先進後出的棧結構Stack<Element> a,b;
一開始所有的Element都在a中,逐個彈出計算合並值,
當遇到乘、除、括弧時計算順序改變成right,把當前結果放到b中暫存。
直到再次遇到加、減、)右括弧時,意味計算順序復位成left,先把b中的暫存結果全部合並後,再繼續算a中的剩餘數據
最後合並成一個結果值。