码迷,mamicode.com
首页 > 其他好文 > 详细

有限自动机编程

时间:2015-06-06 22:09:33      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:有限自动机 状态模式 状态转换表

        /**
	 *考虑一个C语言的程式,由标准输入流一行一行的读取资料,打印各一行的第一个英文单字。
	 *因此一开始需确认第一个英文单字之前是否有空白,若有,需读取所有空白后略过不打印,读取第一个英文单字然后打印,之后读取其他内容略过不打印,直到读到换行符号为止。
	 *任何情形下只要读到换行符号,就重新开始此算法,任何情形下只要读到档案结束(end-of-file)的符号,就结束程式。
	 */
	
	private static final int before=0;
	private static final int inside=1;
	private static final int after=2;
	
	public char getchar(){
		char c=EOF;
		try {
			c = (char)System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return c;
	}
	public void putchar(int c){
		System.out.print(c);
	}
	public static char EOF='#';

	//不使用自动机
	public int method1() {
		int c;
		do {
			c = getchar();
			while (c == ' ')
				c = getchar();
			
			while (c != EOF && c != ' ' && c != '\n') {
				putchar(c);
				c = getchar();
			}
			putchar('\n');
			
			while (c != EOF && c != '\n')
				c = getchar();
		} while (c != EOF);
		return 0;
	}
	
	//使用自动机
	public int method2() {
		int state;
		int c;
		state = before;
		while ((c = getchar()) != EOF) {
			switch (state) {
			case before:
				if (c == '\n') {
					putchar('\n');
				} else if (c != ' ') {
					putchar(c);
					state = inside;
				}
				break;
			case inside:
				switch (c) {
				case ' ':
					state = after;
					break;
				case '\n':
					putchar('\n');
					state = before;
					break;
				default:
					putchar(c);
				}
				break;
			case after:
				if (c == '\n') {
					putchar('\n');
					state = before;
				}
			}
		}
		return 0;
	}
	
	//自动机代码化简
	public int method3() {
		int c;
		int state = before;
		while ((c = getchar()) != EOF) {
			if (c == '\n') {
				putchar('\n');
				state = before;
			} else
				switch (state) {
				case before:
					if (c != ' ') {
						putchar(c);
						state = inside;
					}
					break;
				case inside:
					if (c == ' ') {
						state = after;
					} else {
						putchar(c);
					}
					break;
				case after:
					break;
				}
		}
		return 0;
	}
	
	//自动机代码分离
	public void step(int state, int c) {
		if (c == '\n') {
			putchar('\n');
			state = before;
		} else
			switch (state) {
			case before:
				if (c != ' ') {
					putchar(c);
					state = inside;
				}
				break;
			case inside:
				if (c == ' ') {
					state = after;
				} else {
					putchar(c);
				}
				break;
			case after:
				break;
			}
	}

	int main() {
		int c;
		int state = before;
		while ((c = getchar()) != EOF) {
			step(state, c);
		}
		return 0;
	}
	
	
	//采用状态转换表
	class branch {
		public int new_state;
		public boolean should_putchar;
	    public branch(int new_state,boolean should_putchar){
	    	this.new_state=new_state;
	    	this.should_putchar=should_putchar;
	    }
	};
	public branch transitive_table[][]={
			/*               ' '                      '\n'                    others                */
			/* before */{new branch(before,false),new branch(before,true),new branch(inside,true)},
			/* inside */{new branch(after,false), new branch(before,true),new branch(inside,true)},
			/* after  */{new branch(after,false), new branch(before,true),new branch(after,false)}
			};
	public void step2(int state,int c){
		int idx2 =(c ==' ') ? 0: (c =='\n') ? 1 : 2;
		branch b =transitive_table[state][idx2];
		state =b.new_state;
		if(b.should_putchar)
			putchar(c);
		}
	public int state;
	public int main2(){
		int c;
		state = before;
		while((c =getchar())!= EOF) 
			step(state, c);
		return 0;
		}
	
	//策略模式:采用状态转换表而非状态类
	class StateMachine {
		public int state;
		public branch the_table[][];

		public StateMachine() {
			this.state = before;
		}

		void FeedChar(int c) {
			int idx2 = (c == ' ') ? 0 : (c == '\n') ? 1 : 2;
			branch b = the_table[state][idx2];
			state = b.new_state;
			if (b.should_putchar)
				putchar(c);
		}

		void main() {
			int c;
			StateMachine machine = new StateMachine();
			while ((c = getchar()) != EOF)
				machine.FeedChar(c);
			return;
		}
	};



有限自动机编程

标签:有限自动机 状态模式 状态转换表

原文地址:http://blog.csdn.net/zhangheliang2010/article/details/46391539

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!