利用堆棧進行表達式求值的方法(一)

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

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

一、準備兩個堆棧,一個用於存儲數值,另外一個用於存儲操做符;sql

二、從左向右掃描表達式遇到左括號忽略掉,遇到數值將其壓入數值棧,遇到操做符將其壓入操做符棧;編譯

三、遇到右括號後從操做符棧中先彈出一個操做符,而後從數值棧從彈出兩個操做數進行計算,得出值再壓入數值棧中;編譯原理

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

該算法確實解決了第一個例題,可是第二個就會出錯,由於第3步在計算2*3+4時就有問題,解決的方法放在下篇討論。語法

相關文章
相關標籤/搜索