這個問題一個特點--麻煩!
如何檢查結構呢,結構錯誤是因為不符合我們的目標要求。
在這里我們需要一個格式正確的表達式序列,那么我們就得視具體情況而作出判斷。在這里可是涉及一個巨大的數學思想的!!!其實比較簡單,就是我們高中數學里面最常用到的”分類討論“。
如果你有一個縝密的思路,在這里是非常好的,我這里的分析估計疏漏了大量的情況,希望大家能夠一起補充,共同進步。
首先是比較簡單的一部分,括號數量以及對應情況是否正確。
???????? 那么到底什么是正確的對應呢?類似于這種的()表達式,那么我們現在簡化我們的表達式,假設就只有括號,這可以通過簡單的字符串處理獲得。看以下幾種情況:
((()))
()(())
(()()(()))
我們不難發現都是正確的,那么究竟為什么正確呢?因為每一個‘(’都有一個‘)’與之相對應。那讓我們對這些對應一個個解析
(? ??? (? ???? () ????? ) ??? )
() ??? (? ???? ()????? )
( ???? () ???? ()????? ( ?? ()?? ) ?? )
從顏色我們可以看出,一旦出現‘)’就會與最近的一個‘(’相互配對,我們假設配對以后她們一起消失了,那么后面的‘)’與前面的變化效果是一致的。這樣一來,我們就可以得出一個判斷方法:如果出現‘)’就立刻與前面的‘(’配對,然后一起消失,如果沒有可以配對的就自動留下。直到最后,如果還剩下一些括號,就說明匹配有錯誤。那么這種處理方法要求我們要利用另外一個線性空間保留以前的括號,并且能夠更新(就是比對--匹配--消失)。這時我們容易想到用一個數組(足夠長,以便存放所有的數據),并且用一個整數P指向(其實就是記錄)已經使用的數組(因為我們是線性掃描的,所以在一步一步輸入括號串的時候是逐步向這個數組里面添加數據的)末尾,有新數據進入,就和末尾的數據匹配對比,如果匹配就一起消失(即那個整數P減少一個單位)。如此工作,直至最后。那么我們繼續剖析這個數組,我們可以發現這個數組只在末端處理數據,就像一個餅干袋子,我們吃放都是在一邊進行的(如果有人吃餅干,袋子兩邊都開的話,招呼一聲--還有人跟我一樣--不過我是餅干吃了一半以后再開另外一邊);還有一種形象的比喻是,使用的時候模式就是彈夾的模式。其實這種結構就是那個所謂的棧數據結構。
??????????????? ?
我們定義push(object) 將object壓入棧中,pop()彈出棧頂元素,作為返回值.












以上是操縱的偽代碼,這里需要注意,我們用兩個線性空間存儲數據(一個是存儲所有的待掃描括號,另外一個是用來模擬棧操作的)。
關于stack的具體實現可以查看相關文檔,JAVA里面有這個類大家可以直接用。
然后就是一些繁瑣的分類情況了
?????? a.操作符(包括+-*/^)不能兩個一起連續出現
?????? b.類似于? '('+'操作符' 不能出現(到后面我們是允許減號出現的,因為它可以被理解為負號)?
這些東西很繁瑣,寫文章的時候我在進一步完善這一部分。
好了以上就是結構的檢查部分了。
在這里我們學習了一種數據結構--棧。關于棧的詳細討論任何一本數據結構書中都有詳細說明,大家自己去查閱。
在這里提一個問題:現在有2n+1個數字,其中我們知道有一個數字它出現的次數>=n+1,我們希望通過一次掃描來源數據來找出這個數字,有什么辦法可以解決呢?Please use the stack.It can help you solve this problem.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
