1. 程式人生 > >對於細節的一些處理和領悟

對於細節的一些處理和領悟

space 小時 typedef UNC fun esp links def 不能

都說細節決定成敗,古人誠不欺我。

最近新學了棧與隊列,第一感覺就是棧和隊列與鏈表差不多,只是對於指針的使用和命名有所不同。然後以實際操作就出了大問題。

一、運行超時。

 編寫程序判斷一串字符串中括號是否匹配,采用 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)下一個目標:接下來該學習串與廣義表,希望在學習過後能夠理解和運用。同時要求自己小心寫代碼,莫要因一個字符而排查幾個小時。

對於細節的一些處理和領悟