[关闭]
@iwktd981220 2017-11-17T10:06:46.000000Z 字数 3086 阅读 530

面向对象编程之模板编写栈队列

作业笔记 throw_try_catch nullptr_0_NULL delete_c++



操作文件:tryQueue.cpp

定义

  1. [1](英语:stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象资料型别,其特殊之处在于只能允许在链接串列或阵列的一端(称为堆叠顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。另外栈也可以用一维数组或连结串列的形式来完成。堆叠的另外一个相对的操作方式称为伫列。由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。

    关于堆栈的三种含义


stack

  1. 队列,又称为伫列(queue),是先进先出(FIFO,First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

貌似堆和栈不仅是push和pop方向有点区别,事实上很多地方都有区别。
堆栈之间的区别

主要操作

对于栈堆 [2]

  1. stack,生成栈
  2. push,进栈
  3. pop,出栈
  4. isempty,判断栈是否为空
  5. getTop,返回栈顶元素而不拿出它。
  6. clearStack,销毁栈
    貌似用数组并不存在delete这种释放
    stack

实现方式:使用数组或者链表。

对于队列[3]

  1. queue,生成队列
  2. enqueue(push),入队,若未满,则让他成为最后一个元素
  3. dequeue(pop),出队,若不为空,将第一个元素导出并删除
  4. isQueueEmpty,判断队列是否为空
  5. getHead(front),若不为空,获取头元素,不删除
  6. ~~(back),获得尾元素

queue

实现方式:数组、链表、

老铁,貌似这个是有点问题的,并不可以拿来参考喔0.0
这个也不算有问题吧,缺了点东西而已


写作过程

在写的过程中:
1. 原来可以把链表的结构体写在类当中....可怕的类
2. 每一个成员函数都要记得写模板:template
3. 要如何正确处理head和tail是完成队列的一个重点。


写完以后

个人感受1

            2017.11.17

哇!又一次感受到了自己这方面的缺失,比如什么函数复用:isEmpty()的使用啊!以及逻辑上的问题...下次做作业的时候不能够单单是按照印象来写,最好还是写完以后,按照实验的需要一个一个步骤表现出来,写多了以后再省略这一步,不然真的....逻辑漏洞挺多的...存在无法解决的逻辑判断的话,问问金稳吧orz
另外一个问题是,盲目借书,明明clrs上面是由关于栈队列的内容的,但是自己却去借书,还好借的书还好。


关于报错 throw try catch

来说说一个报错的方式吧!throw try catch

相关代码:throw_try_catch.cpp

相关描述:其中关键字try表示定义一个受到监控、受到保护的程序代码块;关键字catch与try遥相呼应,定义当try block(受监控的程序块)出现异常时,错误处理的程序模块,并且每个catch_block都带一个参数(类似于函数定义时的数那样),这个参数的数据类型用于异常对象的数据类型进行匹配;而throw则是检测到一个异常错误发生后向外抛出一个异常事件,通知对应的catch程序块执行对应的错误处理。

个人理解:

感觉信息量挺大的,留着参考


关于nullptr

另外一个就是使用nullptr 来定义空指针报错

nullptr was not declared in this scope

使用:

g++ -std=gnu++0x *.cpp

原因:c++ 11的特性,需要更新编译器
解决方法:直接把它改成0或者NULL,或者更新编译器(不推荐)参考

更多关于nullptr、0和NULL的参考链接


关于指针销毁

在了解销毁的过程中,了解到那个数组是并不用delete的,而new的那个就需要delete
胡乱delete就会出现:

  1. *** glibc detected *** ./a.out: free(): invalid pointer: 0xb76617b4 ***
  2. ======= Backtrace: =========
  3. /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7533e42]
  4. /usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb772d51f]
  5. /usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1b)[0xb771499b]
  6. /usr/lib/i386-linux-gnu/libstdc++.so.6(+0x909dc)[0xb77149dc]
  7. /usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs6assignERKSs+0x98)[0xb7716478]
  8. /usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSsaSERKSs+0x23)[0xb77164c3]
  9. ./a.out[0x8048e51]
  10. ./a.out[0x8049594]
  11. ./a.out[0x8048fb8]
  12. /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb74d94d3]
  13. ./a.out[0x8048d21]
  14. ======= Memory map: ========
  15. 08048000-0804a000 r-xp 00000000 07:00 785817 /home/brianjustice/CS/a.out
  16. 0804a000-0804b000 r--p 00001000 07:00 785817 /home/brianjustice/CS/a.out
  17. 0804b000-0804c000 rw-p 00002000 07:00 785817 /home/brianjustice/CS/a.out
  18. 0817b000-0819c000 rw-p 00000000 00:00 0 [heap]
  19. b7492000-b7494000 rw-p 00000000 00:00 0
  20. ...`中间省略`
  21. b779d000-b779e000 rw-p 00020000 07:00 267748 /lib/i386-linux-gnu/ld-2.15.so
  22. bf968000-bf989000 rw-p 00000000 00:00 0 [stack]
  23. Aborted (core dumped)

参考链接

关于delete的用法:cplusplus


[1] http://blog.jobbole.com/75321/
[2] http://c.biancheng.net/cpp/html/2699.html
[3] 感觉就是一个使用尾插法的链表。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注