moodlee 发表于 2016-3-19 23:59

【原创源码】C#编写一款自己的脚本语言.第八章

本帖最后由 moodlee 于 2016-3-20 00:12 编辑

第八章 樱花
樱花烂漫几多时?柳绿桃红两未知。
这个时节,樱花绚烂。
——————————
(((( )))(((()))((( )))))
012 3 3 21123 4 43 2   23 4 4 3210
看到没,只要我们为“()”进行编号,一切是这么的清楚明了。
——————————
那么我们如何用代码来描述这种规律呢?
动动我们的大脑,其实很简单的。
——————————
一个小小的实例,我放在沙发~
在看之前,请自己先想想哦!
——————————
明天有一件幸福的事,去赏樱花。去看那错落有致,去看那绚烂至极。(我是真的去看哦~嘻嘻)


moodlee 发表于 2016-3-20 00:00

本帖最后由 moodlee 于 2016-3-20 00:09 编辑

实例对象“1+2*(3+(4-5))-(2+3)”
目的:去除括号

其实,最简单的思路就是递归。
所以,我们只要写一个把扒掉最外层的算法,然后进行递归。


首先,我们定义以下变量:
1、圆括号的编号=-1
2、当前圆括号类型=空
3、非执行代码=空
4、圆括号里内容=空

第一、二、三、四个字符依次是“1+2*”
   判断字符为非“()”
   判断【圆括号的编号】为-1
   将“1+2*”依次添加至【非执行代码】

   1=-1;
   2=空;
   3=1+2*
   4=空

第五个字符是“(”:
   判断字符为“(”
   将【圆括号的编号】自增,即0
   设置【当前圆括号类型】为“(”

   1=0;
   2=“(”;
   3=1+2*
   4=空

第六、七个字符依次是“3+”
   判断字符为非“()”
   判断【圆括号的编号】非-1
   将“3+”依次添加至【圆括号里内容】
   
   
   1=0;
   2=“(”;
   3=1+2*
   4=“3+”

第八个字符是“(”
   判断字符为“(”
   将【圆括号的编号】自增,即1
   设置【当前圆括号类型】为“(”
   判断【圆括号的编号】非0非-1
   将“(”添加至【圆括号里内容】

   1=1;
   2=“(”;
   3=1+2*
   4=“3+(”

第九、十、十一个字符依次是“4-5”
   判断字符为非“()”
   判断【圆括号的编号】非-1
   将“4-5”依次添加至【圆括号里内容】

   1=1;
   2=“(”;
   3=1+2*
   4=“3+(4-5”

第十二个字符是“)”
   判断字符为“)”
   判断【当前圆括号类型】为“(”
   设置【当前圆括号类型】为“)”
   判断【圆括号的编号】非0非-1
   将“)”添加至【圆括号里内容】

   1=1;
   2=“)”;
   3=1+2*
   4=“3+(4-5)”

第十三个字符为“)”
   判断字符为“)”
   判断【当前圆括号类型】为“)”
   将【圆括号的编号】自减,即0
   判断【圆括号的编号】为0
   递归【圆括号里内容】,返回2,将“2”添加至【非执行代码】
   ***以下为部分重置,因为已经扒掉了一最外层皮,准备重新扒皮***
   清空【圆括号里内容】
   设置【圆括号的编号】为-1
   清空【当前圆括号类型】

   1=-1;
   2=空;
   3=“1+2*2”
   4=空

第十四个字符为“-”
   判断字符为非“()”
   判断【圆括号的编号】为-1
   将“-”添加至【非执行代码】
   
   1=-1;
   2=空;
   3=“1+2*2-”
   4=空

第十五个字符为“(”
   判断字符为“(”
   将【圆括号的编号】自增,即0
   设置【当前圆括号类型】为“(”
   
   1=0;
   2=“(”;
   3=“1+2*2-”
   4=空

第十六、十七、十八个字符为“2+3”
   判断字符为非“()”
   判断【圆括号的编号】非-1
   将“2+3”依次添加至【圆括号里内容】
   
   1=0;
   2=“(”;
   3=“1+2*2-”
   4=“2+3”

第十九个字符为“)”
   判断字符为“)”
   判断【当前圆括号类型】为“(”
   设置【当前圆括号类型】为“)”
   判断【圆括号的编号】为0
   递归【圆括号里内容】,返回5,将“5”添加至【非执行代码】
   ***以下为部分重置,因为已经扒掉了一最外层皮,准备重新扒皮***
   清空【圆括号里内容】
   设置【圆括号的编号】为-1
   清空【当前圆括号类型】

   1=0;
   2=空;
   3=“1+2*2-5”
   4=空

最后,我们可以看到【非执行代码】是“1+2*2-5”,很显然,通过第六章的方法,能解出0
————————————
其实,这个算法应该有一个判断:
判断是否存在圆括号“()”
如果存在,就使用上面的去括号计算
如果不存在,就使用第六章中的无括号计算

因为这样的递归才有效哦~
————————————
抱歉,这一章更的有点晚。
近日繁忙,脑力消耗过多。再者总想优化自己的思路,于是重写过一遍,所以更新晚了,抱歉。

moodlee 发表于 2016-3-20 00:00

附上之前章节地址:

第一章:http://www.52pojie.cn/thread-470085-1-1.html
第二章:http://www.52pojie.cn/thread-470424-1-2.html
第三章:http://www.52pojie.cn/thread-471306-1-1.html
第四章:http://www.52pojie.cn/thread-471637-1-1.html
第五章:http://www.52pojie.cn/thread-471937-1-1.html
第六章:http://www.52pojie.cn/thread-472899-1-1.html
第六章.下:http://www.52pojie.cn/thread-473861-1-1.html
第七章:http://www.52pojie.cn/thread-476054-1-1.html

感谢支持!

啊飞 发表于 2016-3-20 00:04

支持技术大神,感谢无私奉献的楼主!

cc286866604 发表于 2016-3-20 00:12

感觉厉害啊,但是我看不懂。就来瞅瞅热闹

E式丶男孩 发表于 2016-3-20 08:46

好文章,不怕晚,支持你哦
页: [1]
查看完整版本: 【原创源码】C#编写一款自己的脚本语言.第八章