都说细节决定成败,古人诚不欺我。
最近新学了栈与队列,第一感觉就是栈和队列与链表差不多,只是对于指针的使用和命名有所不同。然后以实际操作就出了大问题。
一、运行超时。
编写程序判断一串字符串中括号是否匹配,采用 cin.get() 获取字符,然后总会在短短几个字符的判断上运行超时。几经折腾,最后得到老师的帮忙,终于解决了。以下是总结的几个小点。
(1) 将 cin.get() 换成 cin.getline()
以下引用别人的理解:(https://bbs.csdn.net/topics/110037374)
如果生产部门一生产出一个商品就通知销售部门去运河接受货物,而每次销售部门专门耗费了大量人力组织的货物截取活动,却仅仅只能得到连一个最小的运输车都塞不满的产品,这样就得不偿失,于是 双方协商后得到一个解决方案在运河的其中一边设立一个仓库部门,生产部门只要生产出了产品只管发到一个仓库部门,当仓库堆积满了,仓库部门就通知销售方来获取所有的产品(更新缓冲区) |
我是这么理解的,cin.get() 好比每次获取一个元素(生产出一个商品就通知销售部门去运河接受货物),都要先把这一个元素存入缓冲区,然后在获取赋值;而 cin.getline() 则是一次获取一批元 素, 减少了许多不必要的过程。所以在少数元素时,cin.getline() 比 cin.get() 运行速度要快一些。
(2)合理运用逻辑词 &&
这是原本就知道,但很多时候都会忘掉的:(A && B)
当A的值为假时,&& 后面的字符是永远不会被执行的。如果有把握A永远会先于B为假,那么就应该吧A放在前面判断。
二、处理一个小bug
以下时出现bug的代码
1 #include <iostream> 2 using namespace std; 3 4 typedef struct StackNode 5 { 6 int data; 7 struct StactNode *next; 8 }StackNode, *LinkStack; 9 10 void Push(LinkStack &s, int e) 11 { 12 LinkStack p; 13 p = new StackNode; 14 p->data = e; 15 p->next = s; 16 s = p; 17 } 18 19 int main() 20 { 21 22 system( "Pause" ); 23 return 0; 24 }
然后这是报错内容:
C:\Users\SP3\Desktop\未命名1.cpp In function 'void Push(StackNode*&, int)':
15 10 C:\Users\SP3\Desktop\未命名1.cpp [Error] cannot convert 'LinkStack {aka StackNode*}' to 'StactNode*' in assignment
当初我排查了好久也没发现哪里错,报错内容为:无法在分配中将“LinkStack {aka StackNode *}”转换为“StactNode *”。
后来才发现,我打错了一个字符,将第7行的 StackNode 打成了 StactNode,导致每一个节点的 next 指针与下一个节点的类型不同,所以无法转换类型。
久久排查不出的原因有两个:
(1)粗心。t 和 k 小写,外加字体小,一眼扫过去没看出来。
(2)有部分代码是复制以前自己打过的,然后出现这种不能理解的问题,心态崩了,更难看出那一个字母的错误。
以上是我个人的一些理解,如果有错请指出来。
三、以下是个人的学习进度
(1)上一个目标的实现:经过几个小时的排除 bug 的操作,对于栈与队列基本熟悉,链式存储也不再像之前那样陌生了。目标基本完成。
(2)下一个目标:接下来该学习串与广义表,希望在学习过后能够理解和运用。同时要求自己小心写代码,莫要因一个字符而排查几个小时。