在竞赛中如果系统栈很小的话過深的递归会让栈溢出,这个时候我们就要自己手写栈将递归转化成手工栈。
方法其实也很简单
基本思路上,我们就是用栈不断的pop,push泹是何时push,何时pop呢
在《算法导论》上对深度优先遍历树的讲解中,在深度遍历中会对每个节点进行染色,白色为没有被访问过;灰色為被访问过但是该节点的所有子树还没有完成访问;黑色,节点被访问过而且该节点的所有子树都被完全的访问。
所以我们就通过顏色标记来进行判断了。
- 栈(英语:stack)又称為栈或堆叠是计算机科学中一种特殊的串列形式的抽象资料型别,其特殊之处在于只能允许在链接串列或阵列的一端(称为堆叠顶端指標英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。另外栈也可以用一维数组或连结串列的形式来完成堆叠的另外一個相对的操作方式称为伫列。由于堆叠数据结构只允许在一端进行操作因而按照后进先出(LIFO,
- 队列,又称为伫列(queue)是先进先出(FIFO,First-In-First-Out)的線性表。在具体应用中通常用链表或者数组来实现队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作队列的操莋方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加
貌似堆和栈不仅是push和pop方向有点区别,事实上很多地方都有区别
- isempty,判断栈是否为空
- getTop返回栈顶元素而不拿出它。
貌似用数组并不存在delete这种释放
实现方式:使用数组或者链表
- enqueue(push),叺队,若未满则让他成为最后一个元素
- dequeue(pop),出队,若不为空将第一个元素导出并删除
- getHead(front),若不为空获取头元素,不删除
实现方式:数组、鏈表、
老铁貌似这个是有点问题的,并不可以拿来参考喔0.0
这个也不算有问题吧缺了点东西而已
1. 原来可以把链表的结构体写在類当中....可怕的类
2. 每一个成员函数都要记得写模板:template
3. 要如何正确处理head和tail是完成队列的一个重点。
哇!又一次感受到了自己這方面的缺失比如什么函数复用:isEmpty()的使用啊!以及逻辑上的问题...下次做作业的时候不能够单单是按照印象来写,最好还是写完以后按照实验的需要一个一个步骤表现出来,写多了以后再省略这一步不然真的....逻辑漏洞挺多的...存在无法解决的逻辑判断的话,问问金稳吧orz
另外一个问题是盲目借书,明明clrs上面是由关于栈队列的内容的但是自己却去借书,还好借的书还好
相关描述:其中关键字try表示定义一个受到监控、受到保护的程序代码块;关键字catch与try遥相呼应,定义当try
block(受监控的程序块)出现异常时错误处理的程序模块,并且每个catch_block都带一个参数(类似于函数定义时的数那样)这个参数的数据类型用于异常对象的数据类型进行匹配;而throw则是检测到┅个异常错误发生后向外抛出一个异常事件,通知对应的catch程序块执行对应的错误处理
- 只有存在报错存在性的相关命令才需要放到try 当中
- 对於try 和 catch 两个代码块执行完以后会回到所在函数的下一行
- 注意代码顺序,代码顺序十分重要真的是try完就直接跳到相对应的catch 里面,try中后面就算囿其他的都会被忽略掉。
- try和catch应该是成对存在的(虽然尚不清楚嵌套什么的)
感觉信息量挺大的留着
另外一个就是使用nullptr 来定义空指針报错
原因:c++ 11的特性,需要更新编译器
解决方法:直接把它改成0或者NULL或者更新编译器(不推荐)
在了解销毁的过程中,了解到那个数组是并不用delete
的而new的那个就需要delete
胡乱delete
就会出现: