狀態機程式設計思想(1) 括號內外字串統計

2022-01-10 08:55:10 字數 1579 閱讀 7162

這是曾經的乙個面試題,正好引出狀態機程式設計思想。挺不錯的乙個例子。

給定乙個字串,它由以下字元組成:

該字串組成有以下規則限定:

請解決問題:

我們拿到這個問題時,第一感覺往往是順序遍歷字串,並檢測左右相鄰字元是否滿足邊界條件,從而進行分支處理。但是這樣做有以下棘手之處:

嗯,不信的話,可以自己按照上述最簡單的思路實現一下,你就明白了。

有人說,複雜邏輯我不怕啊,細心就好。so...是時候請出我們的大俠--「狀態機」了。

狀態機是編譯原理中的一種技術,學過電學的讀者應該也在《數字電子技術》中用過它,歸根結底,就是把複雜的問題邏輯化為乙個乙個的狀態,我們處理問題的過程就是在各個狀態之間不斷遷移(包含自遷移),這樣畫出來的圖就叫做狀態遷移圖,幫助我們把一鍋難纏的粥轉化為一張清晰的網。當然,這裡不會深究狀態機的概念,詳情請自查(比如還有狀態遷移表等等)。

我設定了兩個狀態,乙個用來區分括號內外,乙個用來區分是否是字母,從而進行不同的處理。

括號內外分成了兩個子狀態,這兩個子狀態是互斥的,因此他們內部的狀態變數可以共用。

至於狀態之間轉移條件,直接看**即可理解:

1

public

class

countwords

2021

public

static

void

test(string str)

37if (c == ')')

40//

括號內狀態

41if (state_inout ==inbracket)

46 } else

if (state_letter ==notletter) 51}

52}53//

括號外狀態

54else

if (state_inout ==outbracket)

61 outlengthofcurrentword = 0;

62 state_letter =notletter;

63 } else

if(character.isletter(c)) 66}

67if (state_letter ==notletter) 72}

73}74}

75 system.out.println("括號內的字串數:" +innumsofword);

76 system.out.println("括號外的最長字串長度:" +outlengthoflongestword);

77system.out.println();

7879}80

81 }

有沒有感覺到很方便?思路更清晰了,效率也上去了。

注:狀態機不同於設計模式中常說的狀態模式(狀態模式用類代表狀態)。

就這麼多吧,歡迎提出測試樣例找bug,共同進步。

按鍵的程式設計 狀態機1

現在的大學教育就是這樣。學無法致用。狀態機第一次見的時候是在數電裡面,那個時候是研究數位電路 比如鎖存器 用到的。不過由於是自學的,所以早就忘的一塌糊塗了。沒上完大學的人就是這樣啊。不過狀態機同樣在硬體的程式設計中得到廣泛使用。第一次見到狀態機的程式設計,就是在按鍵的程式設計中 馬潮老師的書 後來覺...

實際的狀態機程式設計思想例子(zz)

看看小時候玩的5塊錢那種最簡單的電子錶。只有2個按鈕就能操作。暫且稱為按鈕a和按鈕b 現給出乙個完整的功能文字描述 在顯示時間時按a,螢幕顯示變成日期 在顯示日期時按a,螢幕顯示變成秒鐘 在顯示秒鐘時按a,螢幕顯示變成時間 在顯示秒鐘時按b,秒鐘歸0 在顯示時間時按b,螢幕 時間 日期交替顯示。在時...

8 字串轉換整數(有限狀態機DFA)

字串處理的題目往往涉及複雜的流程以及條件情況,如果直接上手寫程式,一不小心就會寫出極其臃腫的 因此,為了有條理地分析每個輸入字元的處理方法,我們可以使用自動機這個概念。我就是直接上手擼 對題目沒有乙個整體的把握和設計,中途遇到某個沒有考慮到的情形就新增 去解決,結果導致之前解決好的問題出現錯誤,提交...