对于细节的一些处理和领悟

都说细节决定成败,古人诚不欺我。

最近新学了栈与队列,第一感觉就是栈和队列与链表差不多,只是对于指针的使用和命名有所不同。然后以实际操作就出了大问题。

一、运行超时。

 编写程序判断一串字符串中括号是否匹配,采用 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)下一个目标:接下来该学习串与广义表,希望在学习过后能够理解和运用。同时要求自己小心写代码,莫要因一个字符而排查几个小时。

posted @ 2019-03-29 15:01  一游此处  阅读(543)  评论(4编辑  收藏  举报