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