链表、队列、堆栈

cskange 2014-08-22 09:24:24

从功能上来说,链表可以取代队列和堆栈。
只在表头删除、只在表尾添加,它就是队列。
只在表头插入、删除,它就是堆栈。
只需用队列或堆栈就能处理的数据结构而用链表,杀鸡用牛刀。因为链表处理速度慢一些,耗费资源多些。

如果自己写这三个模板自己用,是不是会有人觉得:STL已经有了正确、高效的模板,自己写完全是多此一举?
...全文
478 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
cskange 2014-08-25
  • 打赏
  • 举报
回复
引用 29 楼 zhi_ai_yaya 的回复:
[quote=引用 28 楼 cskange 的回复:] [quote=引用 27 楼 zhi_ai_yaya 的回复:] [quote=引用 26 楼 cskange 的回复:] 没有过STL和vector
我再次回头仔细看了一下,这的确是属于c++版块的文章,没有搞错。 重写模板的意义不在于获得更好的性能,而是获得更多的功能。比如一个栈,在STL中只能弹出栈顶元素和计算栈元素数目。那么如果我有需求,需要实现一个能查看栈底元素的功能的栈呢?这时候就只能重写一个stack。[/quote] 你还可以实现查看任意元素的功能, 但那就不叫栈了。 [/quote] 你有认真研究过栈的定义、原理和实现么,不会可以学,但请不要空谈。 栈:是限定仅在一端进行插入或者删除操作的线性表。是一个LIFO线性表(Last In First Out,后进先出的线性表。)栈分为链式栈和顺序栈,分别使用数组和链表实现。 上面所言,查看某个位置的元素,这与栈的定义并不冲突,而且这是因需求而自定义的一个数据结构,何必纠结于是否是原型栈? 对于顺序栈,查看底部的元素是非常容易实现的,直接在函数中return data[0];就OK了。 事实上,我的确可以实现查看任意元素的功能。[/quote] 我是基于栈的原始定义,即数组栈。至于用链表实现的“栈”,它本身就是一个链表,你称它为“链表栈”也行,但是,这只是多了个名称而已。 栈的主要特点是执行深先搜索,所以提供的操作限于pop和push。你非得“扩充”它的功能也未尝不可,只要k不超过栈内元素个数,你返回data[k] 也可以哎。
我叫小菜菜 2014-08-25
  • 打赏
  • 举报
回复
引用 28 楼 cskange 的回复:
[quote=引用 27 楼 zhi_ai_yaya 的回复:] [quote=引用 26 楼 cskange 的回复:] 没有过STL和vector
我再次回头仔细看了一下,这的确是属于c++版块的文章,没有搞错。 重写模板的意义不在于获得更好的性能,而是获得更多的功能。比如一个栈,在STL中只能弹出栈顶元素和计算栈元素数目。那么如果我有需求,需要实现一个能查看栈底元素的功能的栈呢?这时候就只能重写一个stack。[/quote] 你还可以实现查看任意元素的功能, 但那就不叫栈了。 [/quote] 你有认真研究过栈的定义、原理和实现么,不会可以学,但请不要空谈。 栈:是限定仅在一端进行插入或者删除操作的线性表。是一个LIFO线性表(Last In First Out,后进先出的线性表。)栈分为链式栈和顺序栈,分别使用数组和链表实现。 上面所言,查看某个位置的元素,这与栈的定义并不冲突,而且这是因需求而自定义的一个数据结构,何必纠结于是否是原型栈? 对于顺序栈,查看底部的元素是非常容易实现的,直接在函数中return data[0];就OK了。 事实上,我的确可以实现查看任意元素的功能。
cskange 2014-08-24
  • 打赏
  • 举报
回复
引用 25 楼 zhi_ai_yaya 的回复:
[quote=引用 23 楼 cskange 的回复:] [quote=引用 21 楼 zhao4zhong1 的回复:] [quote=引用 19 楼 cskange 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 cskange 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵先生说的这些与我关心的问题无关啊[/quote] 等你将来觉得我说的与你关心的问题大有关系,你的水平就可以和我比肩了。[/quote] 你能否先回答这个问题? STL的堆栈和队列有容量限制吗?就是说,使用时是不是要预设长度?超过就会崩溃?[/quote] 只要内存没耗尽,STL对象超过预设长度会自动增长,不会崩溃。[/quote] 分配一块更大的内存,把“现场”复制过来。在delete“现场”之前,先销毁现场,防止delete调用析构函数[/quote] 使用时是不是要预设长度?超过就会崩溃? 这个问题想得太肤浅了,使用过vector这个号称“动态数组”的东西的人,都能回答这个问题。 STL能作为一个标准、一个可重用的模板,肯定是能够很健壮安全的。而解决方案如上面所言,就是分配一块更大的内存,然后复制所有东西。维护一个size和MaxSize,当多余的内存空间被消耗完后,再申请一块更大的。[/quote] 没有过STL和vector
我叫小菜菜 2014-08-24
  • 打赏
  • 举报
回复
引用 23 楼 cskange 的回复:
[quote=引用 21 楼 zhao4zhong1 的回复:] [quote=引用 19 楼 cskange 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 cskange 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵先生说的这些与我关心的问题无关啊[/quote] 等你将来觉得我说的与你关心的问题大有关系,你的水平就可以和我比肩了。[/quote] 你能否先回答这个问题? STL的堆栈和队列有容量限制吗?就是说,使用时是不是要预设长度?超过就会崩溃?[/quote] 只要内存没耗尽,STL对象超过预设长度会自动增长,不会崩溃。[/quote] 分配一块更大的内存,把“现场”复制过来。在delete“现场”之前,先销毁现场,防止delete调用析构函数[/quote] 使用时是不是要预设长度?超过就会崩溃? 这个问题想得太肤浅了,使用过vector这个号称“动态数组”的东西的人,都能回答这个问题。 STL能作为一个标准、一个可重用的模板,肯定是能够很健壮安全的。而解决方案如上面所言,就是分配一块更大的内存,然后复制所有东西。维护一个size和MaxSize,当多余的内存空间被消耗完后,再申请一块更大的。
cskange 2014-08-24
  • 打赏
  • 举报
回复
引用 27 楼 zhi_ai_yaya 的回复:
[quote=引用 26 楼 cskange 的回复:] 没有过STL和vector
我再次回头仔细看了一下,这的确是属于c++版块的文章,没有搞错。 重写模板的意义不在于获得更好的性能,而是获得更多的功能。比如一个栈,在STL中只能弹出栈顶元素和计算栈元素数目。那么如果我有需求,需要实现一个能查看栈底元素的功能的栈呢?这时候就只能重写一个stack。[/quote] 你还可以实现查看任意元素的功能, 但那就不叫栈了。
cskange 2014-08-24
  • 打赏
  • 举报
回复
引用 22 楼 truexf 的回复:
就数据结构和算法本身来说,STL提供的容器或容器的适配器,搭配STL的算法,已经非常经典,经典的意思是他在追求高效、通用、标准化、用户群方面已经极致。个人觉得没有必要自己实现。 但是另外一个方面,你必须深入理解各个容器和算法的实现方式和原理,才能在实际使用上达到最优。 举例来说: c++是值语义,STL的容器的元素的添加和删除是元素对象的复制构造,而非像其他语言如c#或java只是一个引用(指针)。如果你不注意这点,可能带来非常严重的性能问题。那么这个问题你就可以结合使用指针作为元素,以及配合的模板算法来解决。 在比如说vector在增长的时候,存储元素的内存的增长方式可能不是适合实际需求的,如果你要push_back,大量的元素,那么你应该预先地欧元vector的reserve()函数来预先构建好需要的内存,免得后续在添加元素的时候频繁申请内存。 在大元素个数或超大元素个数的场景中,往往内存分配的问题是对容器性能带来最大影响的因素。而算法之类的都是全世界通用的,优化的空间不大。 我专门写了一篇针对STL的容器的文章,lz可以参考一下: http://blog.csdn.net/truexf/article/details/17303263
好文章!
cskange 2014-08-24
  • 打赏
  • 举报
回复
引用 21 楼 zhao4zhong1 的回复:
[quote=引用 19 楼 cskange 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 cskange 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵先生说的这些与我关心的问题无关啊[/quote] 等你将来觉得我说的与你关心的问题大有关系,你的水平就可以和我比肩了。[/quote] 你能否先回答这个问题? STL的堆栈和队列有容量限制吗?就是说,使用时是不是要预设长度?超过就会崩溃?[/quote] 只要内存没耗尽,STL对象超过预设长度会自动增长,不会崩溃。[/quote] 分配一块更大的内存,把“现场”复制过来。在delete“现场”之前,先销毁现场,防止delete调用析构函数
我叫小菜菜 2014-08-24
  • 打赏
  • 举报
回复
引用 26 楼 cskange 的回复:
没有过STL和vector
我再次回头仔细看了一下,这的确是属于c++版块的文章,没有搞错。 重写模板的意义不在于获得更好的性能,而是获得更多的功能。比如一个栈,在STL中只能弹出栈顶元素和计算栈元素数目。那么如果我有需求,需要实现一个能查看栈底元素的功能的栈呢?这时候就只能重写一个stack。
「已注销」 2014-08-23
  • 打赏
  • 举报
回复
就数据结构和算法本身来说,STL提供的容器或容器的适配器,搭配STL的算法,已经非常经典,经典的意思是他在追求高效、通用、标准化、用户群方面已经极致。个人觉得没有必要自己实现。 但是另外一个方面,你必须深入理解各个容器和算法的实现方式和原理,才能在实际使用上达到最优。 举例来说: c++是值语义,STL的容器的元素的添加和删除是元素对象的复制构造,而非像其他语言如c#或java只是一个引用(指针)。如果你不注意这点,可能带来非常严重的性能问题。那么这个问题你就可以结合使用指针作为元素,以及配合的模板算法来解决。 在比如说vector在增长的时候,存储元素的内存的增长方式可能不是适合实际需求的,如果你要push_back,大量的元素,那么你应该预先地欧元vector的reserve()函数来预先构建好需要的内存,免得后续在添加元素的时候频繁申请内存。 在大元素个数或超大元素个数的场景中,往往内存分配的问题是对容器性能带来最大影响的因素。而算法之类的都是全世界通用的,优化的空间不大。 我专门写了一篇针对STL的容器的文章,lz可以参考一下: http://blog.csdn.net/truexf/article/details/17303263
赵4老师 2014-08-23
  • 打赏
  • 举报
回复
引用 19 楼 cskange 的回复:
[quote=引用 18 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 cskange 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵先生说的这些与我关心的问题无关啊[/quote] 等你将来觉得我说的与你关心的问题大有关系,你的水平就可以和我比肩了。[/quote] 你能否先回答这个问题? STL的堆栈和队列有容量限制吗?就是说,使用时是不是要预设长度?超过就会崩溃?[/quote] 只要内存没耗尽,STL对象超过预设长度会自动增长,不会崩溃。
神奕 2014-08-22
  • 打赏
  • 举报
回复
你可以用标准库提供的容器自己封装一个栈或队列,一样一样的。。。
cskange 2014-08-22
  • 打赏
  • 举报
回复
引用 4 楼 zilaishuichina 的回复:
STL也不一定高效吧,STL只是通用,通用的东西不一定完全适合所有的应用场合,在这样那样的实际开发需求面前,STL做不到尽善尽美,只有适合自己的才是最好的
好见识,谢谢!
zilaishuichina 2014-08-22
  • 打赏
  • 举报
回复
STL也不一定高效吧,STL只是通用,通用的东西不一定完全适合所有的应用场合,在这样那样的实际开发需求面前,STL做不到尽善尽美,只有适合自己的才是最好的
cskange 2014-08-22
  • 打赏
  • 举报
回复
有熟悉STL的回复一下啊
cskange 2014-08-22
  • 打赏
  • 举报
回复
引用 1 楼 jwj070524 的回复:
我告诉你一件事,STL中vector,list,depue之类的是容器,而queue,stack,priority_queue之类的是容器适配器。前者是后者的底层实现,在SGI版本的STL中,queue的实现是用deque,而stack的实现似乎也是deque。
知道有STL这个东西,没有过。所以没看明白你的意思。你是说,不必要自己写吗?
jwj070524 2014-08-22
  • 打赏
  • 举报
回复
我告诉你一件事,STL中vector,list,depue之类的是容器,而queue,stack,priority_queue之类的是容器适配器。前者是后者的底层实现,在SGI版本的STL中,queue的实现是用deque,而stack的实现似乎也是deque。
Evankaka 版主 2014-08-22
  • 打赏
  • 举报
回复
我觉得STL挺好用的。。。。。。。不建议自己写,你写的效率说不定还比不上STL,毕竟人家都是标准委员会写的(貌似),代码肯定比我们写得好吧
cskange 2014-08-22
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
[quote=引用 12 楼 cskange 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵先生说的这些与我关心的问题无关啊[/quote] 等你将来觉得我说的与你关心的问题大有关系,你的水平就可以和我比肩了。[/quote] 你能否先回答这个问题? STL的堆栈和队列有容量限制吗?就是说,使用时是不是要预设长度?超过就会崩溃?
赵4老师 2014-08-22
  • 打赏
  • 举报
回复
引用 12 楼 cskange 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵先生说的这些与我关心的问题无关啊[/quote] 等你将来觉得我说的与你关心的问题大有关系,你的水平就可以和我比肩了。
j8daxue 2014-08-22
  • 打赏
  • 举报
回复
引用 15 楼 cskange 的回复:
[quote=引用 10 楼 j8daxue 的回复:] stl的好处是,大家都熟知的他的接口,性能等。个人代码难以成为标准,除非是公司的基础架构部门。 另外造轮子无非自己锻炼下或者是要满足特殊需求。 最后stl中链表和队列在数据结构实现上有些不同,且stl可以搭配一些泛型算法。
哪里想着成为标准喽,没人这么自不量力的,呵呵 只是觉得用自己的,有点亲切感[/quote] 有的公司不用stl,轮子都是自己造的,这样可以成为一个开发组的标准
加载更多回复(10)

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧