對於細節的一些處理和領悟
都說細節決定成敗,古人誠不欺我。
最近新學了棧與隊列,第一感覺就是棧和隊列與鏈表差不多,只是對於指針的使用和命名有所不同。然後以實際操作就出了大問題。
一、運行超時。
編寫程序判斷一串字符串中括號是否匹配,采用 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)下一個目標:接下來該學習串與廣義表,希望在學習過後能夠理解和運用。同時要求自己小心寫代碼,莫要因一個字符而排查幾個小時。
對於細節的一些處理和領悟