佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

12
返回列表 发新帖
楼主: 莲花

Linked- List

[复制链接]
发表于 15-4-2013 01:14 AM | 显示全部楼层
geekman 发表于 12-4-2013 08:09 PM
Last In Last Out, 缩写LILO,也叫做First In First Out (FIFO),也有人称之为Pipe, 因为存入在里面的 ...

解释得很好,不得不给个赞!
回复

使用道具 举报


ADVERTISEMENT

发表于 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……
唉……误人子弟了……
回复

使用道具 举报

发表于 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 ...

原来,我又误解了-_-|||
回复

使用道具 举报

Follow Us
发表于 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呢?
数据都是一样可以提出来。
谢谢。
回复

使用道具 举报


ADVERTISEMENT

发表于 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():
  1. void main(void)
  2. {
  3.     float avr = Average(7, 8, 9);
  4.     printf("Average = %f", avr);
  5. }

  6. float Average(int n1, int n2, int n3)
  7. {
  8.     int total = Sum(n1, n2, n3);
  9.     average = total / 3;
  10.     return average;
  11. }

  12. int Sum(int n1, int n2, int n3)
  13. {
  14.     return n1 + n2 + n3;
  15. }
复制代码
当Main呼叫Average()时,n1,n2,n3会被推进Stack里面:

  1. stack:
  2. -------------

  3. Pushed [int]n1, n2, n3 (by Main)
  4. -------------
复制代码
Average知道自己有3个int的Argument,因此一开始它就去将3个int从StakPOP出来:

  1. Popped [int] n1, n2, n3 (by Main)

  2. stack:
  3. -------------

  4. [stack empty]
  5. -------------
复制代码
然后呼叫Sum(),再次将n1,n2,n3推进Stack里面:

  1. stack:
  2. -------------

  3. Pushed [int] n1, n2, n3 (by Average)
  4. -------------
复制代码
进入Sum的程序,将最上面的3个int给POP出来:

  1. Popped [int] n1, n2, n3 (by Average)

  2. stack:
  3. -------------

  4. [stack empty]
  5. -------------
复制代码
然后将运算结果(一个int)push进stack,然后return):

  1. stack:
  2. -------------

  3. Pushed [int] sum (by Sum)
  4. -------------
复制代码
这时Average接手,它知道Sum有个int的return value,所以它去stack那里POP了个int出来:

  1. Popped [int] sum

  2. stack:
  3. -------------

  4. [stack empty]
  5. -------------
复制代码
然后计算出average,推进去Stack,然后return:

  1. stack:
  2. -------------

  3. Pushed [float] average (by Average)
  4. -------------
复制代码
现在运行线程回到Main的手里,它知道Average有个float的return value,所以它直接去Stack Pop了个float出来:

  1. Popped [float] average

  2. stack:
  3. -------------

  4. [stack empty]
  5. -------------
复制代码
整个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)

  1. Pipe
  2. ------------
  3. Left-click[X=100, Y=445]
  4. ------------
复制代码
(second click event)

  1. Pipe
  2. ------------
  3. Left-click[X=241, Y=555]
  4. Left-click[X=100, Y=445]
  5. ------------
复制代码
(third click event)

  1. Pipe
  2. ------------
  3. Left-click[X=31, Y=55]
  4. Left-click[X=241, Y=555]
  5. Left-click[X=100, Y=445]
  6. ------------
复制代码
当系统抽得出时间时,就会从底部(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 收起 理由
加峻 + 5 谢谢...很清楚了。

查看全部评分

回复

使用道具 举报

发表于 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出去。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-9-2025 02:50 AM , Processed in 0.115933 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表