有限狀態機,也稱為FSM(Finite State Machine),其在任意時刻都處於有限狀態集合中的某一狀態。當其獲得一個輸入字符時,將從當前狀態轉換到另一個狀態,或者仍然保持在當前狀態。任何一個FSM都可以用狀態轉換圖來描述,圖中的節點表示FSM中的一個狀態,有向加權邊表示輸入字符時狀態的變化。如果圖中不存在與當前狀態與輸入字符對應的有向邊,則FSM將進入“消亡狀態(Doom State)”,此后FSM將一直保持“消亡狀態”。狀態轉換圖中還有兩個特殊狀態:狀態1稱為“起始狀態”,表示FSM的初始狀態。狀態6稱為“結束狀態”,表示成功識別了所輸入的字符序列。
在啟動一個FSM時,首先必須將FSM置於“起始狀態”,然后輸入一系列字符,最終,FSM會到達“結束狀態”或者“消亡狀態”。
狀態機的要素
狀態機可歸納為4個要素,即現態、條件、動作、次態。“現態”和“條件”是因,“動作”和“次態”是果。
-
現態:是指當前所處的狀態。
-
條件:又稱為“事件”。當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。
-
動作:條件滿足后執行的動作。動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態。
-
次態:條件滿足后要遷往的新狀態。“次態”是相對於“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了。
c語言實現
直接先上個圖,就按照這個狀態來寫:
當事件是1的時候,進入的是周一,它的下一個狀態是周二。依次類推
-
定義我們上圖的狀態
-
繼續定義出觸發的事件
-
定義狀態表的數據結構
-
定義出FSM的狀態表
-
狀態機的注冊和狀態轉移
-
事件處理的動作實現
-
再在主函數中調用就好了。
看完整的代碼:
運行的效果: