C 中實現表示式計算

2021-05-28 15:19:09 字數 2240 閱讀 2174

提要:

2.改變了 字串轉化成中綴表示式的方法

一、依舊是資料結構的知識:

1.將中綴表示式轉換成字尾表示式

設演算法的輸入為中綴表示式infixexp(字串),輸出結果為postfixexp,是保值的字尾表示式。

舉例:23 + 34 * 45 / (5 + 6 + 7)      轉後為字尾:      23  34  45  *  5  6  +  7  +   /  +

2.演算法:

自左至右掃瞄infixexp,讀入每項並分析其對應的語法成分:

1)當輸入的是運算元,則直接輸出到postfixexp中。

2)當輸入的是左括號,則把它壓棧。

3)當輸入的是右括號,先判斷棧是否為空,若為空則括號不匹配;若非空,則把棧中的項依次彈出,直到遇到第1個左括號為止,將彈出的項輸出到postfixexp中(彈出的左括號不輸出到postfixexp中),若沒有遇到左括號,則括號也不匹配。

4)當輸入的是運算子op( 四則運算+ - */ 之一)時:

a)迴圈,當(棧非空 and 棧頂不是左括號 and 棧頂運算子的優先順序不低於輸入運算子的優先順序時),反覆操作:將棧頂元素彈出,輸出到postfixexp中。

b)把輸入的運算子op壓棧。

5)最後,當中綴表示式infixexp的符號串行全部讀入後,在棧中可能還會一些項,它們是原來壓入還沒有處理的語法成分。對待它們的方法是:把它們依次從棧中彈出,並輸出到字尾表示式postfixexp的尾部。

二、將字串變成中綴表示式,儲存到q1中

在沒有想到很好的演算法。就是將字串進行分割,把數值儲存到分割後的陣列ressplit中,然後對原來的字串res遍歷,尋找運算子。

期待找到更好的演算法。

//按鈕"="的響應**

protected void buttonequal_click(object sender, eventargs e)

);try

else si++;

}q1.enqueue(tmp);

label1.text = label1.text + tmp.num;//測試

s = 0;

si++;

}                else if ((str[i]==46||( str[i] - 48 <= 9 && 0 <= str[i] - 48)) && s == 0)//新加入的元素是數字,但前面元素也是

else

}change();

double r = calculate();

if(err==false) label1.text = label1.text + "=" + r+ "

";            else           label1.text = label1.text +"error!

";//測試

}catch (exception ew)

}

三 中綴-字尾

public void change()//2) 將中綴表示式轉換成字尾表示式;

else

else

}if (sc.count() != 0)  sc.pop();}}

else

sc.push(q1.peek());

}}            q1.dequeue();

}while (sc.count() != 0)

q2.enqueue(sc.peek());

sc.pop();

}四 字尾求解

public   double calculate()

else if (q2.peek().sign == true)

else if (q2.peek().symbol == '-')

else if (q2.peek().symbol == '*')

else if (q2.peek().symbol == '/')

stmp.push(tmp);

}q2.dequeue();

}if (stmp.count() != 1) err = true;

return stmp.peek().num;

}

五、不足:

1 隨便寫了點,**還很不規範

2 出現錯誤時全部報錯error!,未進行細分

3 限制為double型,無法達到高精度

4 不支援負數,如-6 計算時會出錯,需寫成:(0-6)

C 中實現表示式計算

2011 10 05 13 25 提要 2.改變了 字串轉化成中綴表示式的方法 一 依舊是資料結構的知識 1.將中綴表示式轉換成字尾表示式 設演算法的輸入為中綴表示式infixexp 字串 輸出結果為postfixexp,是保值的字尾表示式。舉例 23 34 45 5 6 7 轉後為字尾 23 34...

表示式計算C

地點 大連理工大學軟體學院 表示式計算至少需要兩個棧 1 資料棧 2 運算子棧 中綴表示式定義 表示式 項 項 項 項 項 項 因子 因子 因子 因子 因子 因子 常數 表示式 常數 數字 數字 數字 數字 0 1 2 3 4 5 6 7 8 9 中綴表示式計算通常按照我們習慣的先乘除後加減,有括號...

用棧實現表示式計算 C

思路 1.首先建立倆個棧,乙個存資料 datastack 另乙個存運算子 operatorstack 2.表示式計算 資料 datasatck,運算子 operatorstack if 當運算子棧為空時 將第乙個運算子放入棧中 else if 此時的運算子的優先順序 棧頂的運算子優先順序 運算子入棧...