天天看點

[随便扯幾句] 關于資料結構

吐槽一下

學校這學期開始使用“SPOC+翻轉課堂”的模式來教資料結構這門課。就我這段時間的體驗來說,這種模式非常非常非常不負責任。雖說學習本就是自己的事情,不能寄希望于别人來督促,但這種模式讓不想學習的人失去了最後的負罪感:

  • 自己不會?組内别人幫忙解答呗~
  • 沒寫作業?反正是一組交一份作業,别人肯定會寫的嘛~
  • 期末挂科?平時分占比那麼高,拿頭挂科?

當然了,我并不關心這個模式的教學效果怎樣,這交給教育學家去頭疼,我對此隻能抱怨一下它在某種程度上加重了我不必要的課業負擔(一個人做一組的作業真的是……)。

但是就這門課而言,據我在SPOC答疑區看到的一系列令人匪夷所思的問題來看,很多人,根本不知道自己在學什麼。

是以,什麼是資料結構?

幾乎所有講述資料結構的書中都開章明義的說:

資料結構是指對資料(操作對象)的描述。

是以,一切就這麼簡單,就這麼一句話而已啊。計算機存儲資料隻能靠01兩個數字,一些進階語言又為我們提供了

int

double

之類的基本資料類型,我們就是要靠這些東西,建構出來一套表示更複雜、更進階東西的接口。比如說,我們現在想要在計算機中表示一個方陣,那麼我們想一下,怎樣才能确定一個方陣呢?對了,我需要知道這個方陣有幾行幾列,這個方陣中每一行每一列到底是誰。那麼,已知一個方陣,我們一般會對他做什麼呢?不改變行數列數的情況下,應該隻有需要改變某一行某一列中到底是誰了吧。好了,這樣我就完成了對一個“方陣”的描述。然後用我熟悉的語言寫出代碼,使得我可以通過這些代碼輕易的知道這個方陣的資訊,輕易地做到我想對方陣做的事情,這樣就完成了!具體他怎麼實作的,我根本就不關心!我既可以這樣實作:

struct 方陣 {
    int 行數, 列數;
    std::vector<std::vector<人>> 内容;
};
           

我也可以這樣實作:

struct 方陣 {
    int 行數, 列數;
    std::vector<人的連結清單結點 *> 内容;
};
           

或者更多更古怪的實作都無所謂,隻要可以完美的滿足我的需求就好了。

那麼,“棧”、“隊列”這些又是些什麼呢?它們是經常用到的“模型”。它們就像一個工具箱一樣,當我們想要擰螺絲(描述一個資料)的時候,由于螺絲有很多不同的種類(不同的資料類型),每個種類都需要單獨的“螺絲刀”(專用的資料結構),但是我們漸漸發現,我們通過工具箱裡一些特定的工具組合起來(也就是“模型”),就能擰上幾乎所有的螺絲了,那麼我在想要擰上螺絲的時候,就會先想到,能不能先用工具箱(“模型”)來解決呢?

一定要用C語言實作嗎?

雖然很多語言已經提供了一些基本的資料結構,但是顯然的,這些資料結構也并不是憑空出來的,至少

Java

C++

都以自己本身實作了這些資料結構,是以說沒有必要因為C語言不行,就抗拒學習資料結構。

何況,語言是工具,而不是束縛你的枷鎖。資料結構,目的是為了描述資料,不是為了練習語言!你雖然确實有必要知道一些常用的資料結構究竟應該怎麼實作(記得要自己實作而不是調用語言本身的功能),但這個實作并不限于C語言。

抽象

在讨論區看到這樣一個問題:

抽象是什麼?抽象有什麼好處?

實際上,當你使用了編譯器随手敲下

gcc a.c

這種指令時,你已經在享受抽象的便利。例如,變量,就是一個抽象出來的概念。記憶體中的資料并不以字元串作為辨別符,而是以

0x****

作為唯一辨別符,你能把一個名字

a

和一個記憶體單元聯系起來,這是語言給你提供的抽象。同理,資料結構裡面,你也可以通過抽象這種技法,将難以了解的東西換成容易了解的東西。

一些令我匪夷所思的問題

Q:請問全棧是什麼意思?

A: 這裡應該是資料結構的讨論區吧……

Q:自從上了資料結構便走火入魔,茶飯不思,日漸消瘦!

A:心疼你喔……

Q:漢諾塔問題利用棧有啥意義?

A: 能解決問題啊!

Q:漢諾塔問題利用遞歸有啥意義?

A:你和上面的那個是一個人發的吧!

Q:如何用C語言聲明一個循環數組?

Q:如何聲明一個循環棧?

Q:什麼是循環樹?

A:強制提問題的規定,把人都逼瘋了……