|
发表于 15-4-2013 01:14 AM
|
显示全部楼层
geekman 发表于 12-4-2013 08:09 PM 
Last In Last Out, 缩写LILO,也叫做First In First Out (FIFO),也有人称之为Pipe, 因为存入在里面的 ...
解释得很好,不得不给个赞!
|
|
|
|
|
|
|
|
发表于 15-4-2013 08:11 AM
|
显示全部楼层
geekman 发表于 12-4-2013 07:47 PM 
残念,现在很多学院/大学的不长进的教师们还在教着C, 而且还是Console C。。。
的确,虽然C有他特有的用处,可我还是觉得OOP是趋势,不如说在马来西亚会C++\Java\C#之类的OOP Language比单纯的C更容易找到工作。
|
|
|
|
|
|
|
|
发表于 15-4-2013 08:14 AM
|
显示全部楼层
geekman 发表于 12-4-2013 08:09 PM 
Last In Last Out, 缩写LILO,也叫做First In First Out (FIFO),也有人称之为Pipe, 因为存入在里面的 ...
原来我自己我白痴了,LinkedList是一种data的保存方法,所以Stack和Pipe都是LinkedList……
唉……误人子弟了…….gif)
|
|
|
|
|
|
|
|
发表于 15-4-2013 09:51 AM
|
显示全部楼层
歩む 发表于 15-4-2013 08:14 AM 
原来我自己我白痴了,LinkedList是一种data的保存方法,所以Stack和Pipe都是LinkedList……
唉……误人子 ...
也不能这么说,正确的说法应该是,Pipe,Stack和Linked List都是使用相同的方法储存数据,只是Pipe和Stack是有固定输入/输出口(在开端或尾端),而Linked List则是没有固定输出/输入口罢了。
|
|
|
|
|
|
|
|
发表于 15-4-2013 10:33 AM
|
显示全部楼层
歩む 发表于 15-4-2013 08:11 AM 
的确,虽然C有他特有的用处,可我还是觉得OOP是趋势,不如说在马来西亚会C++\Java\C#之类的OOP Language比 ...
OOP不是趋势,而是现在的大环境。一眼望去,Windows,OSX,Linux,UNIX,Android,iOS,etc. 没有一个不是Object Oriented的。Console环境的好处是能够让学生在一个简单的环境,心无旁骛的学习一种电脑语言的基础,例如Data Structure,Flow Control,Syntax,Algorithm等,除此之外,如果去更深入的学习那些在Console Mode专用的Library Functions 则已经属于多此一举,浪费时间的事情了。当学生们掌握了这些基础,就应该直接更进一步的的学习OOP,以掌握跟上时代的编程技巧。奈何有的老师依然把Console Programming当成终身事业来教导,可悲。
在论坛上常有些伪大神大言不惭的声称某某电脑语言已死,没有存在价值,那纯属井底之蛙的短见。有人常声嘶力竭的呐喊:“Assembly语言已死,黄天当立!”,但是Assembly真的已死吗?在许多需要分(微)秒必争的系统里,Assembly依然是首选,没有之一。只是这些短见的伪大神在井底里没看见这样的环境罢了。
也有些自以为很厉害的伪大神歇斯底里的呐喊:“BASIC已死,黄天当立!”,但是事实上是,Microsoft依然不断地推出Visual Basic的更新,VB依然是许多编程员的最爱。而对于一个只懂得VB的编程员,他依然可以设计出一个完整的程序,甚至是一个可以卖出数千数十千令吉的商业级软件。
之前我也在另一个帖子里提起,我是专长C++ Builder的编程员,井底里面马上冒出:“C++ Builder 已经濒临死亡,黄天当立!”的呐喊声,我只能嗤之以鼻:“你对C++ Builder又知道多少?你能宣判他的死刑?”。从1997年的C++ Builder 1.0 到现在的C++ Builder XE3(2012年9月发售)依然健壮成长的软件开发工具竟然是“濒临死亡”的电脑语言?不,C++ Builder使用的是C++语言,我相信,在那位伪大神死了n年之后,C++ (包括C++ Builder)依然健在。那伪大神只是在自己的井底里面看到的全都是VC++,VB.NET,VC#,JAVA,然后他就断定C++Builder已死,黄天当立。我一个用C++Builder十几年的人都不敢说它会死呢。
事实上C++ Builder在Embarcadero接手后,将以开发数据库前段作为强打手段,连同Delphi一起稳健的走下去。数据库软件的市场会消失吗?不会。死?人先死了软件/语言都还没死。
呃,跑题太远了。总之,每件东西/事物的存在都有其理由,没必要去否定它,但是也别太依赖它的存在,要不然就矫枉过正了。
本帖最后由 geekman 于 15-4-2013 10:38 AM 编辑
|
|
|
|
|
|
|
|
发表于 15-4-2013 11:39 AM
来自手机
|
显示全部楼层
geekman 发表于 15-4-2013 09:51 AM
也不能这么说,正确的说法应该是,Pipe,Stack和Linked List都是使用相同的方法储存数据,只是Pipe和Stac ...
原来,我又误解了-_-||| |
|
|
|
|
|
|
|
发表于 15-4-2013 11:43 AM
来自手机
|
显示全部楼层
geekman 发表于 15-4-2013 10:33 AM
OOP不是趋势,而是现在的大环境。一眼望去,Windows,OSX,Linux,UNIX,Android,iOS,etc. 没有一个不是 ...
什么language存在必有其道理,不过我还是比较推崇oop就是了。 |
|
|
|
|
|
|
|
发表于 1-5-2013 03:49 PM
|
显示全部楼层
geekman 发表于 12-4-2013 08:09 PM 
Last In Last Out, 缩写LILO,也叫做First In First Out (FIFO),也有人称之为Pipe, 因为存入在里面的 ...
请问,为什么还要分Last In First Out和Last In Last Out呢?
数据都是一样可以提出来。
谢谢。
|
|
|
|
|
|
|
|
发表于 1-5-2013 08:43 PM
|
显示全部楼层
加峻 发表于 1-5-2013 03:49 PM 
请问,为什么还要分Last In First Out和Last In Last Out呢?
数据都是一样可以 ... 因为我们事实上是生活在4次元空间(一般人以为我们生活在3次元空间,那是错误的),有“时间”这个元素。LIFO和FIFO的差别就在于时间 -- 谁先被处理。
LIFO最常用在Program Stack,也就是在呼叫Function时,用来传送Arguments的记忆空间。Main routine呼叫Function时,将Arguments Push进Stack里面,然后跳到Function(Sub-routine)那里,而Function这直接去Stack那里根据Argument Count去Pop相同数量的Data出来。如果Function有Return data的,也同样会在运行结束时把Return Data Push进Stack,然后Main Routine接手运行时也根据Return type来Pop出相当的Data。
这情形在Nested Function Call是就显得重要了,例如Main呼叫Function Average(),而Average()会呼叫Sum():- void main(void)
- {
- float avr = Average(7, 8, 9);
- printf("Average = %f", avr);
- }
- float Average(int n1, int n2, int n3)
- {
- int total = Sum(n1, n2, n3);
- average = total / 3;
- return average;
- }
- int Sum(int n1, int n2, int n3)
- {
- return n1 + n2 + n3;
- }
复制代码 当Main呼叫Average()时,n1,n2,n3会被推进Stack里面:
- stack:
- -------------
- Pushed [int]n1, n2, n3 (by Main)
- -------------
复制代码 Average知道自己有3个int的Argument,因此一开始它就去将3个int从StakPOP出来:
- Popped [int] n1, n2, n3 (by Main)
- ▲
- stack:
- -------------
- [stack empty]
- -------------
复制代码 然后呼叫Sum(),再次将n1,n2,n3推进Stack里面:
- stack:
- -------------
- Pushed [int] n1, n2, n3 (by Average)
- -------------
复制代码 进入Sum的程序,将最上面的3个int给POP出来:
- Popped [int] n1, n2, n3 (by Average)
- ▲
- stack:
- -------------
- [stack empty]
- -------------
复制代码 然后将运算结果(一个int)push进stack,然后return):
- stack:
- -------------
- Pushed [int] sum (by Sum)
- -------------
复制代码 这时Average接手,它知道Sum有个int的return value,所以它去stack那里POP了个int出来:
- Popped [int] sum
- ▲
- stack:
- -------------
- [stack empty]
- -------------
复制代码 然后计算出average,推进去Stack,然后return:
- stack:
- -------------
- Pushed [float] average (by Average)
- -------------
复制代码 现在运行线程回到Main的手里,它知道Average有个float的return value,所以它直接去Stack Pop了个float出来:
- Popped [float] average
- ▲
- stack:
- -------------
- [stack empty]
- -------------
复制代码 整个Function Call流程就是这样。以上的例子并没有很好地将Stack的特性显示出来,如果加多一重Nested Function Call(在Sum里面在多一个Function Call,那么就会有残余Argument/Return data留在Stack里面)。如果你真的明白以上的例子,你就能够自行想象3重Function Call在Stack里的情况。
而FIFO,一般最常见的用处就在Queued Cache,例如当系统繁忙时,你很不耐烦的连按了几下Mouse,系统暂时不得空处理你的Mouse Click,就只好将它们存进Pipe里面:
(first click event)
- Pipe
- ------------
- Left-click[X=100, Y=445]
- ------------
复制代码 (second click event)
- Pipe
- ------------
- Left-click[X=241, Y=555]
- Left-click[X=100, Y=445]
- ------------
复制代码 (third click event)
- Pipe
- ------------
- Left-click[X=31, Y=55]
- Left-click[X=241, Y=555]
- Left-click[X=100, Y=445]
- ------------
复制代码 当系统抽得出时间时,就会从底部(Left-click[X=100, Y=445])开始逐步的抽出数据进行处理,这是Pipe的运行原理。
Pipe和Stack严格来说不是Linked-List,至少并不是完整的Linked-List,只是Pipe,Stack和Linked-List都是用类似的原理运作罢了。
本帖最后由 geekman 于 1-5-2013 08:53 PM 编辑
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 1-5-2013 09:11 PM
|
显示全部楼层
geekman 发表于 1-5-2013 08:43 PM 
因为我们事实上是生活在4次元空间(一般人以为我们生活在3次元空间,那是错误的),有“时间”这个元素。LI ...
请问,4次元空间是指什么?
float avr = Average(7, 8, 9);
float Average(int n1, int n2, int n3)
这边可以读到吗?
不是应该写成这样吗?
float avr = Average(7,8,9);
float avr (int n1,int n2,int n3);
|
|
|
|
|
|
|
|
发表于 1-5-2013 09:15 PM
|
显示全部楼层
四次元空间就是 长、宽、高+时间的空间。
avr 是 Variable name,Average是Function name。 |
|
|
|
|
|
|
|
发表于 8-6-2013 09:57 PM
|
显示全部楼层
歩む 发表于 9-4-2013 10:35 PM 
last in last out 说的是queue,不是LinkedList,如字面上所说,就像排队一样,最后一个进来的只能最后一 ...
想请问stack和queue会有什么用处呢?
|
|
|
|
|
|
|
|
发表于 13-6-2013 10:18 PM
|
显示全部楼层
加峻 发表于 8-6-2013 09:57 PM 
想请问stack和queue会有什么用处呢?
queue的话我从没用过,这里只好说声抱歉了。总之很像韩信那个推陈出新这样啦。
stack就很常用了,例如mobile app的page,每开一个page就会push进去stack里面,按一次back就会把现在显示的也就是最顶端的page pop出去。
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|