PHP 状态机

来源:互联网 发布:淘宝最好的手机店 编辑:程序博客网 时间:2024/05/18 00:49

前段时间遇到一个问题:

找出一个文本文件中所有符合条件的字符串(文本文件都是字母可能有回车,换行)

  条件格式:
  1.左边三个大写字母
  2.中间一个小写字母
  3.右边三个大写字母

 

文本文件str.txt如下:

sdfasdfAAAsAAAdfasddllfadsBBBsBBBdfdfdfsdfdfdfadfsfaHHHsKKKsaddfkkslslAAAAhBBBddfFFhMMM

 

一直想不到怎么解决,后来有高人指点,推荐使用状态机,正则表达式匹配也可以但速度慢。

在网上查了查状态机的资料,并不全面:

 状态机
 把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。
 同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,
 有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。
 
 状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
 ①现态:是指当前所处的状态。
 ②条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
 ③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
 ④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

 

解决这个问题可能涉及栈结构

 栈
 后进先出

 

  +++++++++++++++解题思路++++++++++++++++++++++++++++++
  
  定义状态:对栈的情况定义相关的状态
  栈空状态:  stat0,
  栈中一个有效数据:stat1
  栈中两个有效数据:stat2
  栈中三个有效数据:stat3
  栈中四个有效数据:stat4
  栈中五个有效数据:stat5
  栈中六个有效数据:stat6
  栈中七个有效数据:stat7
  
  单个字符扫描文件让符合条件的字符入栈,根据栈的状态做出相应动作
  0.初始状态栈空,即$curState=0,遇到大写字母入栈,栈中一个有效字母,修改栈状态:$curState=1
  1.当栈状态为1时,下一个字母必须为大写,才能入栈,否则置空栈,恢复栈状态:$curState=0
  2.当栈状态为2时,下一个字母必须为大写,才能入栈,否则置空栈,恢复栈状态:$curState=0
  3.当栈状态为3时,下一个字母必须为小写,才能入栈,否则置空栈,恢复栈状态:$curState=0
  4.当栈状态为4时,下一个字母必须为大写,才能入栈,否则置空栈,恢复栈状态:$curState=0
  5.当栈状态为5时,下一个字母必须为大写,才能入栈,否则置空栈,恢复栈状态:$curState=0
  6.当栈状态为6时,下一个字母必须为大写,才能入栈,否则置空栈,恢复栈状态:$curState=0
  7.当栈状态为7时,下一个字母必须为小写,此时栈中元素符合了有效条件格式,把栈中元素传给$box数组,然后置空栈,恢复栈状态:$curState=0;否则置空栈,恢复栈状态:$curState=0
  
  必须考虑栈的当前状态与下一个状态成立间的关系,即现态与次态
  $box数组中就是文本文件中所有符合条件格式的字符串

 

//状态数组 $state = array('stat0','stat1','stat2','stat3','stat4','stat5','stat6','stat7'); //栈数组 $shed = array(); //所有符合条件的字符 $box = array();  //文件路径 $file = 'e:/web/test/str.txt'; //当前状态$state[0] $curState = 0;  $handle = fopen($file,'r'); while(!feof($handle)){$string = fgetc($handle);if(ord($string)==13 || ord($string)==10) continue;//遇到回车或换行跳过$case = $string == strtoupper($string) ? 'upper' : 'lower';//判断大小写switch($curState){case 0:if($case=='upper') {array_push($shed,$string); $curState++;}break;case 1:if($case=='upper') {array_push($shed,$string); $curState++;}else{$shed=array();$curState=0;}break;case 2:if($case=='upper') {array_push($shed,$string); $curState++;}else{$shed=array();$curState=0;}break;case 3:if($case=='lower') {array_push($shed,$string); $curState++;}else{$shed=array();$curState=0;}break;case 4:if($case=='upper') {array_push($shed,$string); $curState++;}else{$shed=array();$curState=0;}break;case 5:if($case=='upper') {array_push($shed,$string); $curState++;}else{$shed=array();$curState=0;}break;case 6:if($case=='upper') {array_push($shed,$string); $curState++;}else{$shed=array();$curState=0;}break;case 7:if($case=='lower'){$box[]=$shed; $shed=array();$curState=0;}else{$shed=array();$curState=0;}break;} }  echo '<pre>';print_r($box);


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿漾奶呼呼吐怎么办 初生婴儿黑白颠倒怎么办 新生儿6天拉肚子怎么办 婴儿眼里有泪水怎么办 十个月宝宝拉肚子怎么办 腹泻十几天了怎么办 新生儿37.3度要怎么办 婴儿发烧37.3度怎么办 小孩子太吵了怎么办 一年级孩子学习差怎么办 马克笔涂错了怎么办 孩子说话不流利怎么办 儿童最近不吃饭怎么办 不爱吃饭偏瘦怎么办 一岁半小宝宝不爱吃饭怎么办 家养的小鸡打架怎么办 小鸡关在一起打架怎么办 小孩感冒出汗多怎么办 宝宝感冒出汗了怎么办 出汗多怎么办%3f 孩子睡觉出汗多怎么办 三年级孩子成绩下滑怎么办 幼儿数学不开窍怎么办 孩子一年级学习跟不上怎么办 孩子学习不认真怎么办 孩子平时不细心怎么办? 脖子出现黑圈怎么办 简历留白太多怎么办 excel数字外面加个圈怎么办 电脑输入法数字数不上怎么办 大班教案迷路了怎么办 迷路了怎么办活动反思 头突然眩晕是怎么办 孩子学习拖拉懒惰怎么办 头发晕想睡觉怎么办 五年级错别字多怎么办 入党志愿书写错字怎么办 高中不会写作文怎么办 考试不会写作文怎么办 高考不会写作文怎么办 孩子总是写错字怎么办