簡單實用演算法 計算數學表示式

2022-01-12 00:35:04 字數 3156 閱讀 9525

目錄變數定義:str-數學表示式

注:數學表示式的數值支援小數,符號只支援+ - * / ( )這幾種。

計算原理::先將數學表示式的字串(中綴表示式)轉化為字尾表示式,然後計算字尾表示式的值。

注:為了運算結果的精度,運算過程中統一使用decimal型別的資料。

例:輸入表示式"10*1.1/(2+8)+1.1+2.2-4.3",輸出結果「0.1」。

**如下:

//測試演算法

class program

}/// /// 計算數學表示式,基於字尾表示式的實現,可使用 + - * / ( ) 運算子

///

class calculator

catch (overflowexception)

catch (exception)

}//生成字尾表示式

private static queuecreaterpn(string str)

else if ((str[i] >= '0' && str[i] <= '9') || (str[i] == '.'))

else

else

}i++;

}queue.enqueue(cur.tostring());

}else if (str[i] == ')')

stack.pop();

i++;

}else

stack.push(str[i]);

i++;}}

while (stack.count != 0)

return queue;

}//處理符號優先順序

private static int compare(char peek, char c)

//解析字尾表示式

private static decimal parserpn(queuequeue)

else

}return res.pop();

}//基本運算單元

private static decimal calculate(decimal a, decimal b, string t)

else if (t.equals("-"))

else if (t.equals("*"))

else

}}

注:上面的**簡單擴充套件一下即可支援更複雜的運算子

中綴表示式轉化為字尾表示式規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於找頂符號(乘除優先加減)則棧頂元素依次出找並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

例:中綴表示式「9+(3-1)3+10/2」轉化為字尾表示式「9 3 1-3+ 10 2/+」。

字尾表示式的計算過程規則:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

一種更簡單的方法,使用datatable.compute計算數學表示式,**如下:

//測試演算法

static void main(string args)

/// /// 計算數學表示式的值

///

/// 數學表示式

/// 計算結果

private static double calculate(string str)

catch (overflowexception)

catch (exception)

}

*注:datatable.compute計算的結果有decimal、double兩種(已測試出的),個人猜測在decimal取值範圍內的運算不會發生double運算的精度損失,但計算結果只能用範圍較大的double型別表示。

目前來看,datatable.compute計算數學表示式的適用範圍更全面一些

可以通過執行sql語句得到數學表示式的結果,sql語句如下:

string strsql="select "+"10*1.1/(2+8)+1.1+2.2-4.3";
使用sql語句的好處是可以計算含有開方、平方等更高階運算的數學表示式,最簡單、方便的是使用使用sqlite(沒有資料庫的通訊開銷)資料庫來計算數學表示式,**如下:

/// /// 計算給定的表示式

///

/// 表示式

///

public static object sqlitecompute(string expr)

", ")");

if (!directory.exists(path)) directory.createdirectory(path);

string connstr = path.combine(path, "computeengine.db");

if (!file.exists(connstr)) file.create(connstr).close();

using (sqliteconnection conn = new sqliteconnection("data source=" + connstr))

}

使用方法:

static void main(string args)

計算結果:

0.371153744479045
關於然後使用sqlite資料庫,可以參考c#中sqlite的使用及工具類。

堆疊實現計算數學表示式——csdn

接觸字尾表示式(逆波蘭表示法)——veda

將中綴表示式轉化為字尾表示式——veda

**字尾表示式的計算過程——veda

c#裡如何計算乙個表示式的值——csdn

算數表示式的計算

一 算數表示式的兩種表示 在計算機中進行算數表示式的計算是通過棧來實現的。算數表示式的兩種表示方法 即中綴表示式和字尾表示式。把雙目運算子出現在兩個運算元中間的這種習慣表示叫做算數表示式的中綴表示,這種算數表示式被稱為中綴算數表示式或中綴表示式。就是平常我們習慣的表示方式 例如 2 5 6 中綴表示...

數學計算表示式解析

最近在寫乙個計算器的專案,其中最麻煩的就是數學表達試的解析,用c語言解決問題,每一步基本都要自己實現,非常鍛鍊邏輯能力。用了將近兩個晚上的時間,終於完成了大部分表示式的解析,寫這篇文章來記錄下遇到的問題。涉及到二維指標。主要思想和這篇部落格中的一樣 首先進行括號代換,就是將括號中的表示式單獨計算出來...

C 數學表示式計算

c 計算 數學表示式 標量的值 搞個字典 string double 更具 操作符號 分割字串 更具 優先順序把資料 push stack 再每次 分別 pop 2個資料,和 乙個操作符,一直到全部結束 效果下圖如圖 部分核心 如下 空 stack 返回 true 空 stack 返回 true p...