C 中實現表示式計算

2022-04-30 18:54:06 字數 2636 閱讀 5081

2011-10-05 13:25

提要: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遍歷,尋找運算子。

期待找到更好的演算法。

[csharp]view plain

copy

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

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)  

}  三 中綴-字尾

[csharp]view plain

copy

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();  }}

四 字尾求解  

[csharp]view plain

copy

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 中實現表示式計算

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

表示式計算C

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

用棧實現表示式計算 C

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