吐槽一下
学校这学期开始使用“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:强制提问题的规定,把人都逼疯了……