计算机中的栈的模板,面向对象编程之模板编写栈队列

本文深入探讨了栈和队列这两种基本的数据结构。介绍了栈的后进先出(LIFO)特性及其实现方式,并对比了队列的先进先出(FIFO)机制。详细解释了两者的操作方法和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

作业笔记 throw_try_catch nullptr_0_NULL delete_c++

操作文件:tryQueue.cpp

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

关于堆栈的三种含义

Data_stack.svg

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

堆栈之间的区别

主要操作

对于栈堆 [2]stack,生成栈

push,进栈

pop,出栈

isempty,判断栈是否为空

getTop,返回栈顶元素而不拿出它。

clearStack,销毁栈

貌似用数组并不存在delete这种释放

056c5b9610abf817e56dea2f3ff861e1.png

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

对于队列[3]queue,生成队列

enqueue(push),入队,若未满,则让他成为最后一个元素

dequeue(pop),出队,若不为空,将第一个元素导出并删除

isQueueEmpty,判断队列是否为空

getHead(front),若不为空,获取头元素,不删除

~~(back),获得尾元素

72e7a415f1e84e9a0692131d36ecb1ac.png

实现方式:数组、链表、老铁,貌似这个是有点问题的,并不可以拿来参考喔0.0

这个也不算有问题吧,缺了点东西而已

写作过程

在写的过程中:

1. 原来可以把链表的结构体写在类当中....可怕的类

2. 每一个成员函数都要记得写模板:template

3. 要如何正确处理head和tail是完成队列的一个重点。

写完以后

个人感受12017.11.17

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

另外一个问题是,盲目借书,明明clrs上面是由关于栈队列的内容的,但是自己却去借书,还好借的书还好。

关于报错 throw try catch

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

相关代码:throw_try_catch.cpp

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

个人理解:只有存在报错存在性的相关命令才需要放到try 当中

对于try 和 catch 两个代码块执行完以后会回到所在函数的下一行

注意代码顺序,代码顺序十分重要,真的是try完就直接跳到相对应的catch 里面,try中后面就算有其他的,都会被忽略掉。

try和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就会出现:

***glibc detected***./a.out:free():invalid pointer:0xb76617b4***

=======Backtrace:=========

/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7533e42]

/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb772d51f]

/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1b)[0xb771499b]

/usr/lib/i386-linux-gnu/libstdc++.so.6(+0x909dc)[0xb77149dc]

/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs6assignERKSs+0x98)[0xb7716478]

/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSsaSERKSs+0x23)[0xb77164c3]

./a.out[0x8048e51]

./a.out[0x8049594]

./a.out[0x8048fb8]

/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb74d94d3]

./a.out[0x8048d21]

=======Memorymap:========

08048000-0804a000r-xp0000000007:00785817/home/brianjustice/CS/a.out

0804a000-0804b000r--p0000100007:00785817/home/brianjustice/CS/a.out

0804b000-0804c000rw-p0000200007:00785817/home/brianjustice/CS/a.out

0817b000-0819c000rw-p0000000000:000[heap]

b7492000-b7494000 rw-p0000000000:000

...`中间省略`

b779d000-b779e000 rw-p0002000007:00267748/lib/i386-linux-gnu/ld-2.15.so

bf968000-bf989000 rw-p0000000000:000[stack]

Aborted(core dumped)

关于delete的用法:cplusplus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值