c 利用字尾表示式 計算多項式

2021-07-08 21:08:21 字數 2840 閱讀 2002

本來大一的時候在acm的時候學資料結構的時候學過多項式計算  那個時候用的c語言  ,當時覺得好複雜,,大概徘徊過將近一周 都沒有啃下來,後來也就放棄了,,現在學習c#的win form 想寫過計算器來練習 練習,,那麼問題來了 多項式計算腫麼辦,, 所以這次又花了乙個周的時間 從理解字尾表示式開始一直到擼**,,成就感還是蠻大的,,,廢話結束,進入正題:

大致思路:

將中綴表示式 轉為字尾表示式 用到兩個棧,乙個棧儲存 數字(這個棧我定義的 private stackopnumber = new stack()) 還有乙個符號棧(private stackopre = new stack();)

然後遍歷乙個string的字串 

(1)如果是數字 就入數字棧 

(2)如果是符號 就比較 符號棧棧頂的運算子的優先順序與這個符號的優先順序

1)  如果棧頂的優先順序大於或者等於當前的 運算子優先順序 就將 棧頂的運算子 彈出來 並且 數字棧也彈兩個數字 與這個運算子進行計算 然後將計算結果入數字棧

2)如果棧頂的優先順序小於於當前的 運算子優先順序 就直接將這個運算子壓入符號棧

(3)如果是'(' 直接壓符號棧

(4)如果是')' 那麼出棧符號棧 直到遇到'(' ,並且出乙個符號的時候 從數字棧出棧兩個數字 並且計算 然後將結果壓棧數字棧

(5)最後將所有的符號棧的符號出棧 每齣棧乙個符號 出棧兩個數字 計算 結算結果壓入數字棧.

(6)最後在不考慮特殊情況的情況下 彈出數字棧的僅剩下的乙個數字 也就是最終的結果

總結: 大致思路就是這個樣子 不過還有很多特殊情況要處理:

1,開始遍歷之前 先處理這個表示式 看有沒有不合格的字元

2,如果是乙個負數 那麼符號就會出問題(符號過多) 所以 遇到數字是負數的時候就 壓棧數字棧乙個0,

1),什麼情況下是乙個負數呢  ,表示式第乙個符號是- ,還有乙個左括號之後緊接著是乙個-的情況下 需要數字棧壓棧0

3,還有取數字的時候 注意連續的數字和. 處理為乙個數字 不要分開了(當然我的容錯能力有限 比如 乙個數字裡面有兩個小數點 沒有處理)

4,出棧的時候注意判斷 棧是否已經為空

接下來是我寫的參考**:

(bug是有的 不過問題不太大 還有就是容錯能力有限,,歡迎修改)

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace 字尾表示式_多項式計算

set}

private static int judgeop(char c) //判斷字元優先順序

public void showopnumber() //輸出運算元(測試)

", i == res.length - 1 ? "\n" : "");

}// console.writeline();

char res1 = new char[20];

res1 = this.opre.toarray();

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

", i == res.length - 1 ? "\n" : "");}}

public void finallycaculate()

//給出結果

while (this.opnumber.count() != 0)

}private static decimal caculate(char c, decimal number1, decimal number2) //計算

else if (c == '-')

else if (c == '*')

else if (c == '/')

return number2 / number1;

}else

}//檢測表示式

private static bool expredetec(ca this1) //傳參乙個物件

}return true; //表示式ok

}//檢測是不是全是數字

private static bool detecnumber(char c)

else

return false;

}//一直出符號棧 直到遇到左括號

private static void stackopuntilleft(ca this1)

this1.opre.pop();//彈出左括號

}//數字棧 入棧 ()

private static int stackpushnumber(ca this1, int i) //物件, 入棧符號

this1.opnumber.push(decimal.parse(temp));

i--;

return i;

// return i -- 錯誤寫法

}//入棧符號

private static void stackpushopre(ca this1, char ex, int i)

}else if (ex == ')') //右括號 出符號棧 直到遇到左括號

else //運算符號

else}}

public bool getpostfixexpression()

if (detecnumber(expre[i])) //數字

else //如果是 符號

}return true;

}else //表示式檢測錯誤的

}class program

}console.readkey();}}

}}

中綴表示式轉字尾表示式之多項式計算器

要求 1.可以計算多位整數。比如2就是個位整數,234就是多位整數。2.滿足帶括號的要求 include define max 50 int level char p 規定運算子優先順序 return temp void cal int number int numbertop char symbo...

中綴表示式轉字尾表示式之多項式計算器

要求 1.可以計算多位整數。比如2就是個位整數,234就是多位整數。2.滿足帶括號的要求 include define max 50 int level char p 規定運算子優先順序 return temp void cal int number int numbertop char symbo...

C語言 利用 字尾表示式 求解 中綴表示式

一名大一初學狗,最近在學習棧的應用,在此記錄解題 題目描述 給出乙個表示式,其中運算子僅包含 要求求出表示式的最終值 資料可能會出現括號情況,還有可能出現多餘括號情況 資料保證不會出現 maxlongint的資料 資料可能回出現負數情況 輸入僅一行,即為表示式 輸出僅一行,既為表示式算出的結果 樣例...