有限自动机编程

        /**
	 *考虑一个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;
		}
	};

				
时间: 2024-11-02 00:23:40

有限自动机编程的相关文章

有限自动机

有限自动机有一个有限的状态集合和一些从一个状态转向另一个状态的边,每条边上标记有一个符号:其中一个状态是初态,某些状态是终态.确定的有限自动机 (DFA)确定的有限自动机中,不会有从同一状态出发的两条边的标记有相同的符号,DFA以如下方式接收或拒绝一个字符串1.从初始状态出发,对于输入字符串的每个字符,自动机都将沿着一条确定的边后到达另一状态.2.对n个字符的字符串进行n次状态转换后,自动机达到了一个终态,自动机将接受该字符串.若达到的不是终态,或者找不到与输入字符匹配的边,那么拒绝.自动机可以

面向对象编程思想

http://blog.csdn.net/yzh648542313/article/details/34157593 面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计. 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单

程序员菜鸟必备——作为独立开发者如何系统的学习编程

接触一个行业,前期最好来一个系统的学习,有完整的框架一点一点的把基础吃透,不能左一耙子,右一锄头,以我的从业经验给大家分享如何系统的学习编程开发,刚入坑的程序员菜鸟注意了,迅速占领高地,迅速收藏了. 总体大致分为以下几类: A.教材上的知识 这部分内容来自计算机专业的课程教材.也有可能会涉及一部分来自其他相关专业或者相关课程的内容. B.编程语言 每一个程序员只有在会使用一门语言的情况下才有可能从事开发工作,所以学习并掌握一门语言是最低要求了. C.SDK 光有一门语言是不够的,从事任何实际的软

《C专家编程》读书笔记

<C专家编程>读书笔记 C语言的设计哲学: 一切工作程序员自己负责. 语言中的所有特性都不需要隐式的运行时支持. 程序员所做的都是对的. 程序员应该知道自己在干什么,并保证自己的所作所为是正确的. --第1章-- C: 穿越时空的迷雾 小即是美.事物发展都有个过程,由简入繁,不能一开始就想得太复杂,Multics, IBM的OS/360都是因此而失败. C语言的许多特性是为了方便编译器设计者而建立的.----唉,怎么这个样子 C语言的基本数据类型直接与底层硬件相对应.----确实如此 regi

面向对象编程思想 - 月亮晶石的日志 - 网易博客

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计. 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统).这可以使系统直接地映射问题域,保

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因为一行简单的配置之后, 你就可以像使用本机文件一样使用远程的任何文件. 无论是想编辑, 查看还是删除重命名, 都和本机文件一样的用. 这么神奇的功能到底如何

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

iOS开发——网络编程OC篇&amp;Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.