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 此時的運算子的優先順序 棧頂的運算子優先順序 運算子入棧...