1. 程式人生 > >利用堆疊進行表示式求值的方法(一)

利用堆疊進行表示式求值的方法(一)

開發十年,就只剩下這套架構體系了! >>>   

例如給定如下的算術表示式:(1+((2+3)*(4*5)),需要解決的問題是如何通過程式碼程式進行解析並求值,本文的主要目的是利用其中的方法去解決正則表示式解析、sql語法解析等涉及到編譯原理方面的某些問題,當然編譯原理方面的知識遠比這複雜,我們的重點是語法解析這個主題。

本文也是對“演算法(第四版)”中的1.3.1.7章節的總結和完善,實際上如果直接採用文中的方法是解決不了該例題“(1+((2*3+4)*(4*5))”的,不過它提供瞭解決的思路,注意:簡單起見括號、數值、操作符均以空格分開便於程式解析,先描述原始步驟:

1、準備兩個堆疊,一個用於儲存數值,另一個用於儲存操作符;

2、從左向右掃描表示式遇到左括號忽略掉,遇到數值將其壓入數值棧,遇到操作符將其壓入操作符棧;

3、遇到右括號後從操作符棧中先彈出一個操作符,然後從數值棧從彈出兩個運算元進行計算,得出值再壓入數值棧中;

4、按照1~3的步驟,當表示式掃描完畢後計算出的結果就是最終值。

該演算法確實解決了第一個例題,但是第二個就會出錯,因為第3步在計算2*3+4時就有問題,解決的方法