第一篇:PHP 程序員學數據結構與算法之《?!?/a>
PHP 程序員學數據結構與算法之《棧》
介紹
“要成高手,必練此功”。
要成為優秀的程序員,數據結構和算法是必修的內容。而現在的Web程序員使用傳統算法和數據結構都比較少,因為很多算法都是包裝好的,不用我們去操心具體的實現細節,如PHP的取棧操作array_pop,進棧操作array_push,都有指定的庫函數,導致我們對基礎算法的研究越來越少,最后成為一個工具的傀儡而已。
所以我還是建議更多的coder從基礎開始學習。這篇就先講我們最熟悉的棧操作開始入手,讓我們熟悉棧。
棧為何物?
口訣“后進先出”,這是我印象最深的一句話,也是老師一坨講解中,印象最深刻的。
定義:棧是限制插入和刪除都只能發生在一個位置上進行的線性表,該位置是線性表的末端,叫做棧的頂。
過程:先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。
分析
通過定義和過程,我們分析出數據結構(紅色標識),動作部分(藍色標識),以及動作的規則(黃色標識)。
請看
lv包包、古奇女包、coach包:www.tmdps.cn|兔毛皮草、獺兔皮草、皮草服飾:www.tmdps.cn
組成成分
數據:線性表(用array結構保存命名為data),末端索引(用int結構保存命名為end,初始值為null——因為開始線性表是沒有元素的,所以就沒有末端索引這么一說,而且由于不斷取數據,添加數據,這個末端是變化的元素。)。
動作(方法):壓入(push:規則,放在線性表最后面),彈出(pop:規則,從最后取出,并且末端位置向前移動)。
編碼
lv包包、古奇女包、coach包:www.tmdps.cn|兔毛皮草、獺兔皮草、皮草服飾:www.tmdps.cn
運行結果
lv包包、古奇女包、coach包:www.tmdps.cn|兔毛皮草、獺兔皮草、皮草服飾:www.tmdps.cn
總結
以上是本人對棧的分析理解過程,由于我是一名php coder,所以我用php的角度去分析和編碼。
如果是C語言去編碼,數組應該指定最大寬度,因為C語言數組不像php數組能自行增長,必須要有一個初始寬度。
lv包包、古奇女包、coach包:www.tmdps.cn|兔毛皮草、獺兔皮草、皮草服飾:www.tmdps.cn
第二篇:數據結構棧與隊列報告
棧和隊列上機實習
1、實驗目的:
(1)熟練掌握棧的邏輯結構和操作規則,能在相應的實際問題中正確選用該結構。(2)熟練掌握棧的2種存儲結構實現方法(順序棧和鏈棧),兩種存儲結構和基本運算的實
現算法,注意??蘸袧M的判斷條件及它們的描述方法。
(3)熟練掌握隊列的邏輯結構和操作規范,能在相應的實際問題中正確選用該結構。(4)掌握循環隊列與鏈隊列兩種存儲結構的實現,熟練掌握各種隊列基本運算的實現。
2、實驗要求:
(1)順序棧的插入、刪除,棧頂數據元素的讀取。(2)鏈棧的插入、刪除,棧頂數據元素的讀取。(3)循環隊列的插入、刪除。(4)鏈隊列的插入、刪除。
3、實驗內容: ① 棧
(1)抽象數據類型定義
typedef struct
{
ElemType data[MaxSize];
//棧的空間大小為MaxSize
int top;
//設置棧頂指針
}SqStack;
//棧的結構定義
在本次實驗中,首先建立一個空棧,進入主程序后首先初始化棧為其分配空間,然后進入菜單選擇界面,通過不同的數字輸入,實現入棧,出棧,讀取棧頂元素,顯示棧的所有元素,棧的長度,釋放棧等操作。
(2)存儲結構定義及算法思想
在棧結構體的定義中,typedef int Typeelem 為整型,存儲結構(入棧)如下:
cin>>a;
s->top++;
//在入棧是首先將棧頂指針向上加1
s->data[s->top]=a;
//與數組賦值一樣,直接賦值
//其他存儲與此類似,都是直接賦值與數組的某一位
退棧函數模塊:
void Pop(SqStack * &s){
//對指針的引用
if(s->top ==-1){
cout<<“棧是空棧,不能退棧”< //首先判斷是否為空棧,若為空,則退出 return;} cout<<“退棧的元素為:”< //顯示退棧元素 s->top--; //棧頂元素減1,指向實際棧的最上面 } 顯示棧所有元素函數模塊: void DispStack(SqStack *s){ //從棧頂到棧底順序顯示所有元素 int i;cout<<“棧的元素分別為:”< //同過循環實現實現從棧頂元素到棧底元素的遍歷以輸出 } cout< 棧結構的入棧和退棧是兩個相反的過程,先進后出,入棧是先讓棧頂指針加1,指向未被賦值位置,然后進行賦值,退棧是先取出退棧元素,然后棧頂元素減1,指向推展后的實際棧頂。諸如讀取棧頂元素,顯示棧的元素,讀取棧的長度,都是用過對棧頂指針實現相關操作。 (3)實驗結果與分析 ② 循環隊列 (1)抽象數據類型定義 typedef struct { ElemType elem[Maxqsize]; //循環隊列的長度為MaxSize int front,rear; //設置隊列的頭指針和尾指針 }SqQueue; //循環隊列的結構體定義 在本次實驗中,首先建立一個空隊列,進入主程序后首先初始化隊列為其分配空間,然后進入菜單選擇界面,通過不同的數字輸入,實現入隊,出隊,顯示隊列的所有元素,隊列的長度,釋放隊列等操作。 (2)存儲結構定義及算法思想 在隊列結構體的定義中,typedef int Typeelem 為整型,存儲(入隊)結構如下: q->rear=(q->rear+1)%Maxqsize; //尾指針加1 q->elem[q->rear]=a; //將入隊元素裝到新的空尾部 在此隊列的存儲結構的實現:先讓隊尾指針進1,再將新的元素加入到隊尾指針所指示的位置,因此,隊尾指針指示實際的隊尾位置,隊頭指針指示實際隊頭的前一位置,要想退出隊頭元素,必須先讓隊頭指針進1,才能取出隊頭元素。 退隊函數模塊如下: void deQueue(SqQueue *&q){ //對指針的引用 if(QueueEmpty(q)) { //調用帶返回值的判斷空隊函數 cout<<“隊列為空”< //判斷隊列是否為空 } q->front=(q->front+1)%Maxqsize; //隊頭指針進1 cout<<“退隊的元素為:”< //取出隊頭元素 } 遍歷隊表函數: void displayqueue(SqQueue *q){ int m;m=q->front+1; //隊頭元素進1,指向實際隊頭 if(QueueEmpty(q)) { cout<<“隊列為空”< //判斷是夠為空隊 } cout<<“所有隊列元素為:”< while(q->rear+1>m){ cout< //通過循環遍歷所有元素 m++; } cout< 循環隊列的入隊和退隊分別是在隊尾與隊頭跟別進行操作的,通過隊頭隊尾指針的操作便可實現對隊列的相關操作。 (3)實驗結果與分析 ③ 心得體會 本次上機是做棧與隊列的操作,這次實驗,我有意的用到了對指針的引用與指針實現子函數功能的調用,剛開始編譯的時候也有錯誤,但是在慢慢的摸索中,也逐漸掌握了它們的用法,這次實驗也讓我熟練了對隊列與棧存儲結構的應用。 附錄: 順序表源代碼: 棧: #include void InitStack(SqStack * &s) //建立一個空棧,即將棧頂指針指向-1即可 的引用 { s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} void ClearStack(SqStack * &s) //釋放棧s占用的存儲空間 { free(s);} void StackLength(SqStack *s) { cout<<“棧的長度為:” <<(s->top +1)< int StackEmpty(SqStack *s){ return(s->top==-1);} void Push(SqStack *&s){ if(s->top==MaxSize-1) { cout<<“棧滿”< // s=(SqStack *)realloc(s,sizeof(SqStack));} int a; 指針 cout<<“請輸入入棧元素”< void Pop(SqStack * &s){ if(s->top ==-1){ cout<<“棧是空棧,不能退?!? return;} cout<<“退棧的元素為:”< void GetTop(SqStack * &s,ElemType &e){ if(s->top==-1){cout<<“空?!? void DispStack(SqStack *s) //從棧頂到棧底順序顯示所有元素 { int i;cout<<“棧的元素分別為:”< cout<<“請選擇功能”< cout<<“ 入棧 1”< cout<<“ 出棧 2”< cout<<“ 讀取棧頂元素 3”< cout<<“ 顯示棧所有元素 4”< cout<<“ 棧的長度 5”< cout<<“ 釋放棧 6”< cin>>k; switch(k) { case 1: Push(s);break; case 2: Pop(s);break; case 3: GetTop(s,e);cout<<“棧頂元素為: ”< case 4: DispStack(s);break; case 5: StackLength(s);break; case 6: ClearStack(s);break; default :break; } } } 隊列: #include TypeElem elem[Maxqsize]; int front,rear;}SqQueue;void InitQueue(SqQueue *&q){ q=(SqQueue *)malloc(sizeof(SqQueue)); q->front=q->rear=0;} void ClearQueue(SqQueue *&q){ free(q);exit(0);} void QueueLength(SqQueue *q){ cout<<“隊列長度為:”<<(q->rear-q->front+Maxqsize)%Maxqsize< return(q->front==q->rear); } void enQueue(SqQueue *&q){ int a; if((q->rear+1)%Maxqsize==q->front) { cout<<“隊列已滿,無法插入”< } cout<<“請輸入插入元素”< cin>>a; q->rear=(q->rear+1)%Maxqsize; q->elem[q->rear]=a;} void deQueue(SqQueue *&q){ if(QueueEmpty(q)) { cout<<“隊列為空”< } q->front=(q->front+1)%Maxqsize; cout<<“退隊的元素為:”< } void displayqueue(SqQueue *q){ int m;m=q->front+1; if(QueueEmpty(q)) { cout<<“隊列為空”< } cout<<“所有隊列元素為:”< while(q->rear+1>m) { cout< m++; } cout< int k=0; SqQueue *q; InitQueue(q); if(QueueEmpty(q))cout<<“隊列為空”< while(1){ cout<<“請選擇功能”< cout<<“ 入隊 cout<<” 出隊 cout<<“ 隊列長度 cout<<” 顯示隊列元素 cout<<“ 釋放棧 cin>>k; switch(k) { case 1: enQueue(q);break; case 2: deQueue(q);break; case 3: QueueLength(q);break; case 4: displayqueue(q);break; case 5: ClearQueue(q);break; default :break; } } } 1”< 2“< 4“< **的個人簡歷 個人資料 姓名: **電子郵件: ******@qq.com 名族: 漢出生日期: 1991/1/3 學歷: 本科居住地址: 深圳福田 性別: 男手機號碼: 186***7739 4求職意向 到崗時間:即時 期望職位:php程序員 工作性質:全職 專業技能 1、熟練掌握PHP,HTML,DIV+CSS,Javascript,Ajax,jQuery等Web開發技術。 2、熟練使用PDO、MySQL方式操作MySQL數據庫系統,熟悉MySQL事物及存儲過程。 3、熟悉HTML,DIV+CSS前臺頁面技術和XML的使用。 4、熟悉網頁靜態化、Smarty緩存,thinkPHP緩存,掌握Web防SQL注入。 5、孰悉MVC架構開發思想模式,熟練使用Smarty模板,ThinkPHP框架,ZendFramework框架。 6、熟練掌握Zend Studio, Dreamweaver,Notepad++, EclipsePHP等常用Web開發工具; 7、了解Linux基本操作。 項目經驗? 項目一 項目名稱:地球新聞網 軟件環境: 開發工具: 項目描述: linux+apache+mysql+php Zend Studio 1.該項目是一個集各種新聞的網站。2.前臺采用div+css,javascript等 技術進行頁面布局,Javascript和Jquery技術制作下拉菜單、表單驗證、復選框等效果。3.后臺采用全面向對象開發,良好的運用了MVC三層架 構模式。 責任描述:獨立開發 項目體會:通過開發這次項目,使我對制作一個網站有了一個全面的了解,也同時增 加了我的技術能力;通過該網站使我了解只有想不到,沒有做不到。同時 也想到在這個發展迅速的社會,我們只有不斷努力學習新的技術才能滿足 客戶的要求。 ? 項目二 項目名稱:聚焦購物商城 軟件環境: 開發工具: 項目描述: windows+apache+mysql+php Zend Studio 8.0 該項目是一個大型的網站商城,采用thinkPHP主流框架開發。 前臺包括:商品列表、搜索、商品詳細頁、注冊、登錄、購物車、會員 中心、評論等。后臺有:商品管理、訂單管理、會員管理、商家管理等。 滿足用戶購物流程的各種需求 責任描述: 負責完成了MySQL數據表、字段、索引的分析與創建,主頁的圖片輪換,商品詳細 頁,購物車模塊,登錄注冊等功能,以及后臺商品管理模塊。 項目體會:通過此次項目的實戰,讓我對thinkPHP的掌握更加深刻,同時給我感覺的是使用模板的開發速度之快,更實現的HTML的代碼與PHP代碼的分 離,使得擁有更好的擴展以及維護。 工作經驗 2012/8—2013/4業聚醫療器械(深圳)有限公司技術員 工作感想 之前的公司主要是生產和研發介入性醫療器械的一家公司,我的工作任務主要從事公司導管支架的研發,研發多種不同尺寸型號的球囊擴張導管。在我的工作中,使我學到了很多東西,讓我變得更加細心,做事情更加注重細節,更有時間觀念等等。 教育經歷 ? 2013/4—2013/8達內PHP培訓php程序員主要學習了:linux系統常用操作命令,HTML/CSS,Javascript/Jquery/Ajax的前臺技術,學習了用Linux系統和Windows系統開發項目,學習了Smarty模板,Zendframework,thinkPHP框架的使用,學習了DEDECMS二次開發。 在學習的過程中,自己獨立完成了一個小項目《地球新聞網》,和同學合作完 成了一個商城網站《聚焦購物》,通過這兩個項目的實戰,為我以后的工作打 下了堅實的基礎。 ? 2008/9—2012/7湖北信息工程專修學院電子商務本科主要學習了:計算機應用基礎,管理學,電子商務概論,網頁設計與制作,電子商務法,商務溝通與談判及商業職業道德專業課程,安全教育等課程。 通過這些課程的學習,使我對電子商務系統建設與管理打下了良好的基礎,同時也使我擁有較強的溝通能力和職業道德水準。 個人評價 1.本人細心,樂觀積極心態,吃苦耐勞,勇于挑戰自我,熱愛學習,喜歡總結; 2.具備良好的團隊精神,能很好的與團隊協作開發,有良好的溝通能力,喜歡交朋友; 3.性格開朗,陽光,喜歡籃球,游泳,羽毛球等體育運動。 《數據結構與算法》課程學習總結報告 100401200510計本(4)班章興春 本學期所學習的《數據結構與算法》課程已經告一段落,就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。以便在所學習知識有更深刻的認識。 一、《數據結構與算法》知識點: 學習數據結構之前、一直以為數據結構是一門新的語言、后來才知道學習數據結構是為了更加高效的的組織數據、設計出良好的算法,而算法則是一個程序的靈魂。經過了一學期的數據結構了,在期末之際對其進行總結。首先,學完數據結構我們應該知道數據結構講的是什么,數據結構課程主要是研究非數值計算的研究的程序設計問題中所出現的計算機處理對象以及它們之間關系和操作的學科。 第一章主要介紹了相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。 第二章具體地介紹了順序表的定義、特點及其主要操作,如查找、插入和刪除的實現。需要掌握對它們的性能估計。包括查找算法的平均查找長度,插入與刪除算法中的對象平均移動次數。 鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。 第三章介紹了堆棧與隊列這兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。算法上要求掌握進棧、退棧、取棧頂元素、判棧空盒置空棧等五種操作及掌握使用元素個數計數器及少用一個元素空間來區分隊列空、隊列滿的方法。 第四章串和數組中,我們知道串是一種特殊的線性表,是由零個或多個任意字符組成的字符序列。串的儲存結構分為緊縮模式和非緊縮模式。 基本運算需掌握求串長、串賦值、連接操作、求子串、串比較、串定位、串插入、串刪除、串替換等。 第五章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。 樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。 第六章介紹了圖的概念及其應用,圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。 最后兩章集體說明了查找和排序算法,查找教材上介紹了靜態查找表和哈希查找表,靜態查找表中介紹了順序查找、折半查找以及分塊查找。哈希法中,學習要點包括哈希函數的比較;解決地址沖突的線性探查法的運用,平均探查次數;解決地址沖突的二次哈希法的運用。 排序是使用最頻繁的一類算法,可分為內部排序和外部排序。主要需要理解排序的基本概念,在算法上、需要掌握插入排序(包括直接插入排序算法、折半插入排序算法),交換排序(包括冒泡排序算法、快速排序遞歸算法),選擇排序(包括直接選擇排序算法、堆排序算法)等。 二、對各知識點的掌握情況 總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象?,F將各個章節出現的知識點理解情況列舉如下。 第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。 第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。 鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。 接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。 在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。 第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。 第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。 散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。 最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。 由于平時上機練習的少,對于教材中很多算法都掌握的不是很熟悉、不過這些都是可以彌補的,我會在剩下的時間中不斷練習書上給出的算法和練習,正如教材上說的,學習數據結構,僅從書本上學習是不夠的,必須經過大量的程序設計實踐,在實踐中體會構造性思維方法,掌握數據組織與程序設計技術。 三、學習體會: 多做實驗!這個就沒有太多理由了,我一直覺得編程是一門熟練科學,多編程,水平肯定會提高,最重要的是能夠養成一種感覺,就是對程序對算法的敏感,為什么那些牛人看一個算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了過了一陣子又忘記了?其實這個是因為牛人們以前看的程序很多,編得也很多,所以他們有了那種感覺,所以我覺得大家應該多看程序,多寫程序,培養自己的感覺。 復習和考試的技巧,我想大家應該都有這樣的感覺,就是覺得自己什么都掌握了,但是在考試的時候就是會犯暈,有時候一出考場就知道錯在哪個了,然后考完以后一對答案,發現其實考得很簡單,應該都是自己會做的,這個就是與自己的復習和考試的技巧有關系了。 首先就是復習,前面已經說過其實我們學的算法也就是幾十個,那么我們的任務也就是理解這幾十個算法,復習也就是要加深你的理解。如何理解算法,然后理解到什么程度呢? 是能默出整個算法嗎?其實不是這樣的,數據結構的考試有它的特點,考過程考試了,大家應該都發現數據結構其實不要求你把整個算法背出來,它注重考察你的理解,那么怎么考察呢?其實也就是兩種方式吧,一種就是用實例,就是給你一個例子,要你用某個算法運行出結果,我想這個期末考試的時候仍然會有很多這樣的題目,比如排序那塊就很好出這樣的題目,要復習這種題目我覺得很簡單,就是每個算法都自己用例子去實踐一下,以不變應萬變,我期中復習的時候就是這樣去做的,而且考試之前我就覺得那個并查集的題目就很有可能會考,于是就自己出了幾個例子,做了一下。另外一種考察方式就是算法填空和算法改錯,可能有一些同學覺得這種題目很難,其實我們首先可以確定這兩種題目肯定是與書上算法有關系的,只要理解了書上的算法就可以了,有人覺得看完書以后什么都懂了,而且要默也默得出來,其實不是這樣的,算法改錯和填空主要是考察的細微處,雖然你覺得你默得出來,那是能夠默出算法的主體部分,很多細微的地方你就會很容易忽略。我想大家考過期中考以后應該都有這種感覺吧?那要怎樣解決這種問題呢? 我覺得有兩種方法,一種就是自己去編程實現,這種方法比較有意義,還能夠提高編程水平,另外一種就是用實例分析算法的每句話,我認為這種方法是最有效的。 然后還有一種題目,就是最后的寫算法的題目,我覺得這種題目還是很好解決的,只要是能夠自己做出作業的,基本上都會很容易做出來,這也是為什么我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心,尤其是題目簡單的時候,那肯定會有一些小地方要考慮清楚,一不小心就會被扣掉很多分,這樣很不值。 我覺得考試的時候沒有太多要講的,只要復習好了,考試的時候細心一點就可以了,然后就是做一個題目開始就要盡量保證正確,如果覺得留在那里等后面做完了再來檢查,這樣錯誤還是很有可能檢查不出來,我期中考試的時候就基本上沒有檢查,因為我做每個題目都是確保正確,用的時間也挺多的,然后也覺得沒有檢查的必要了。 三、對《數據結構與算法》課程教學的建議 1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。 2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。 3、要更加重視實驗的重要性。 以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進! 《數據結構》教學大綱 一、課程基本信息 課程名稱:數據結構 總學時:64(理論課內學時48,上機課內學時16)課程設計:24 課程類型:必修課 考試形式:半開卷考試 講課對象:計算機本科 建議教材:《數據結構》(C語言版)陳明 編著 清華大學出版社 課程簡介:數據結構課程介紹如何組織各種數據在計算機中的存儲、傳遞和轉換。內容包括:數組、鏈接表、棧和隊列、串、樹與森林、圖、排序、查找、索引與散列結構等。課程以結構化程序設計語言C語言作為算法的描述工具,強化數據結構基本知識和結構化程序設計基本能力的雙基訓練。為后續計算機專業課程的學習打下堅實的基礎。 二、課程的教學目標 “數據結構”是計算機相關專業的一門重要專業基礎課,是計算機學科的公認主干課。課程內容由數據結構和算法分析初步兩部分組成。 數據結構是針對處理大量非數值性程序問題而形成的一門學科,內涵豐富、應用范圍廣。它既有完整的學科體系和學科深度,又有較強的實踐性。通過課程的學習,應使學生理解和掌握各種數據結構(物理結構和邏輯結構)的概念及其有關的算法;熟悉并了解目前常用數據結構在計算機諸多領域中的基本應用。 算法分析強調最基本的算法設計技術和分析方法。要求學生從算法和數據結構的相互依存關系中把握應用算法設計的藝術和技能。 經過上機實習和課程設計的訓練,使學生能夠編制、調試具有一定難度的中型程序;以培養良好的軟件工程習慣和面向對象的軟件思維方法。 “數據結構”的前序課是《離散數學》、《C語言程序設計與算法初步》。 三、理論教學內容的基本要求及學時分配 1、序論(2學時)學習目標:熟悉各類文件的特點,構造方法以及如何實現檢索,插入和刪除等操作。 重點與難點:本章無。 知識點:數據、數據元素、數據結構、數據類型、抽象數據類型、算法及其設計原則、時間復雜度、空間復雜度。 2、線性表(4學時) 學習目標: (1)了解線性表的邏輯結構特性是數據元素之間存在著線性關系,在計算機中表示這種關系的兩類不同的存儲結構是順序存儲結構和鏈式存儲結構。用前者表示的線性表簡稱為順序表,用后者表示的線性表簡稱為鏈表; (2)熟練掌握這兩類存儲結構的描述方法以及線性表的基本操作在這兩種存儲結構上的實現; (3)能夠從時間和空間復雜度的角度綜合比較線性表兩種存儲結構的不同特點及其適用場合; (4)結合線性表類型的定義增強對抽象數據類型的理解。 重點與難點:鏈表是本章的重點和難點。扎實的指針操作和內存動態分配的編程技術是學好本章的基本要求,分清鏈表中指針 p 和結點 *p 之間的對應關系,區分鏈表中的頭結點、頭指針和首元結點的不同所指以及循環鏈表、雙向鏈表的特點等。 知識點:線性表、順序表、鏈表、有序表。 3、棧和隊列(4學時) 學習目標: (1)掌握棧和隊列這兩種抽象數據類型的特點,并能在相應的應用問題中正確選用它們; (2)熟練掌握棧類型的兩種實現方法; (3)熟練掌握循環隊列和鏈隊列的基本操作實現算法;(4)理解遞歸算法執行過程中棧的狀態變化過程。 重點與難點:棧和隊列是在程序設計中被廣泛使用的兩種線性數據結構,因此本章的學習重點在于掌握這兩種結構的特點,以便能在應用問題中正確使用。 知識點:順序棧、鏈棧、循環隊列、鏈隊列。 4、串(2學時) 學習目標:(1)理解串類型定義中各基本操作的特點,并能正確利用它們進行串的其它操作; (2)理解串類型的各種存儲表示方法;(3)理解串匹配的各種算法。 重點和難點:相對于其它各個知識點而言,本章非整個課程的重點,鑒于串已是多數高級語言中已經實現的數據類型,因此本章重點僅在于了解串類型定義中各基本操作的定義以及串的實現方法,并學會利用這些基本操作來實現串的其它操作。本章的難點是理解實現串匹配的KMP算法的思想。 知識點:串的類型定義、串的存儲表示、串匹配、KMP算法。 5、數組和廣義表(4學時) 學習目標: (1)理解數組類型的特點及其在高級編程語言中的存儲表示和實現方法,并掌握數組在“以行為主”的存儲表示中的地址計算方法; (2)掌握特殊矩陣的存儲壓縮表示方法; (3)理解稀疏矩陣的兩類存儲壓縮方法的特點及其適用范圍,領會以三元組表示稀疏矩陣時進行矩陣運算所采用的處理方法。 重點和難點:本章重點是學習數組類型的定義及其存儲表示。 知識點:數組的類型定義、數組的存儲表示、特殊矩陣的壓縮存儲表示方法、隨機稀疏矩陣的壓縮存儲表示方法。 6、樹和二叉樹(8學時) 學習目標: (1)領會樹和二叉樹的類型定義,理解樹和二叉樹的結構差別;(2)熟記二叉樹的主要特性,并掌握它們的證明方法; (3)熟練掌握二叉樹的各種遍歷算法,并能靈活運用遍歷算法實現二叉樹的其它操作; (4)理解二叉樹的線索化過程以及在中序線索化樹上找給定結點的前驅和后繼的方法; (5)熟練掌握二叉樹和樹的各種存儲結構及其建立的算法;(6)學會編寫實現樹的各種操作的算法; (7)了解最優樹的特性,掌握建立最優樹和赫夫曼編碼的方法。 重點和難點:二叉樹和樹的遍歷及其應用是本章的學習重點,而編寫實現二叉樹和樹的各種操作的遞歸算法也恰是本章的難點所在。 知識點:樹的類型定義、二叉樹的類型定義、二叉樹的存儲表示、二叉樹的遍歷以及其它操作的實現、線索二叉樹、樹和森林的存儲表示、樹和森林的遍歷以及其它操作的實現、最優樹和赫夫曼編碼。 7、圖(8學時) 學習目標: (1)領會圖的類型定義; (2)熟悉圖的各種存儲結構及其構造算法,了解各種存儲結構的特點及其選用原則; (3)熟練掌握圖的兩種遍歷算法;(4)理解各種圖的應用問題的算法。 重點和難點:圖的應用極為廣泛,而且圖的各種應用問題的算法都比較經典,因此本章重點在于理解各種圖的算法及其應用場合。 知識點:圖的類型定義、圖的存儲表示、圖的深度優先搜索遍歷和圖的廣度優先搜索遍歷、無向網的最小生成樹、最短路徑、拓撲排序、關鍵路徑。 8、查找(6學時) 學習目標: (1)理解“查找表”的結構特點以及各種表示方法的適用性;(2)熟練掌握以順序表或有序表表示靜態查找表時的查找方法; (3)熟悉靜態查找樹的構造方法和查找算法,理解靜態查找樹和折半查找的關系; (4)熟練掌握二叉查找樹的構造和查找方法;(5)理解二叉平衡樹的構造過程; (6)熟練掌握哈希表的構造方法,深刻理解哈希表與其它結構的表的實質性的差別; (7)掌握描述查找過程的判定樹的構造方法,以及按定義計算各種查找方法在等概率情況下查找成功時的平均查找長度。 重點和難點:本章重點在于理解查找表的結構特點及其各種表示方法的特點和適用場合。 知識點:順序表、有序表、索引順序表、靜態查找樹、二叉查找樹、二叉平衡樹、哈希表。 9、內部排序(6學時) 學習目標: (1)理解排序的定義和各種排序方法的特點,并能加以靈活應用。排序方法有不同的分類方法,基于“關鍵字間的比較”進行排序的方法可以按排序過程所依據的不同原則分為插入排序、交換排序、選擇排序、歸并排序和計數排序等五類; (2)掌握各種排序方法的時間復雜度的分析方法。能從“關鍵字間的比較次數”分析排序算法的平均情況和最壞情況的時間性能。按平均時間復雜度劃分,內部排序可分為三類:O(n2)的簡單排序方法,O(n*logn)的高效排序方法和O(d*n)的基數排序方法; (3)理解排序方法“穩定”或“不穩定”的含義,弄清楚在什么情況下要求應用的排序方法必須是穩定的。 重點和難點:希爾排序、快速排序、堆排序和歸并排序等高效方法是本章的學習重點和難點。 知識點:排序、直接插入排序、折半插入排序、表插入排序、希爾排序、起泡排序、快速排序、簡單選擇排序、堆排序、2-路歸并排序、基數排序、排序方法的綜合比較。 10、文件(4學時) 學習目標:熟悉各類文件的特點,構造方法以及如何實現檢索,插入和刪除等操作。 重點和難點:本章重點在于了解各種文件的結構特點及其適用場合。知識點:順序文件、索引文件、B-樹、B+樹、索引順序文件、VSAM文件、散列文件、多關鍵字文件。 四、實驗教學內容的基本要求及學時分配 1、線性表(1學時)實驗一 順序表的應用 實驗二 鏈表的應用 要求:理解線性表的定義及其運算;理解順序表和鏈表的定義,組織形式,結構特征和類型說明;掌握在這兩種表上實現的插入,刪除和按值查找的算法;了解循環鏈表,雙(循環)鏈表的結構特點和在其上施加的插入,刪除等操作。 2、棧(0.5學時)實驗三 棧的應用 要求:理解棧的定義,特征及在其上所定義的基本運算;掌握在兩種存儲結構上對棧所施加的基本運算的實現。 3、隊列(0.5學時)實驗四 隊列的應用 要求:理解隊列的定義,特征及在其上所定義的基本運算;掌握在兩種存儲結構上對隊列所施加的基本運算的實現。 4、串(0.5學時)實驗五 串的應用 要求:了解串的定義;理解和領會串的存儲方式;掌握常用的串運算。 5、數組和廣義表(0.5學時)實驗六 稀疏矩陣的應用 要求:理解多維數組的結構特點和在內存中的兩種順序存儲方式;理解并掌握矩陣和特殊矩陣元素在存儲區中地址的計算;領會稀疏矩陣的壓縮方式和簡單運算;了解廣義表的定義和基本運算。 6、樹與二叉樹(4學時)實驗七 樹與二叉樹的應用 要求:理解樹的定義,術語;領會并掌握樹的各種存儲結構;熟練掌握森林與二叉樹間的相互轉換;領會樹和森林的遍歷;了解樹的簡單應用。深刻理解二叉樹的定義,性質及其存儲方法;熟練掌握二叉樹的二叉鏈表存儲方式,結點結構和類型定義;理解并掌握二叉樹的三種遍歷算法;掌握二叉樹的線索化方法;靈活運用二叉樹的遍歷方法解決相關的應用問題。 7、圖(3學時)實驗八 圖的應用 要求:理解圖的基本概念及術語;掌握圖的兩種存儲結構(鄰接矩陣和鄰接表)的表示方法;熟練掌握圖的兩種遍歷(深度優先搜索遍歷和廣度優先搜索遍歷)的算法思想,步驟,并能列出在兩種存儲結構上按上述兩種遍歷算法得到的序列;理解最小生成樹的概念,能按Prim算法構造最小生成樹;領會并掌握拓撲排序,關鍵路徑,最短路徑的算法思想。 8、查找(3學時)實驗九 順序查找 實驗十 折半查找 實驗十一 哈希表的應用 實驗十二 二叉排序樹的綜合練習要求:了解查找的基本思想及查找成功和不成功的概念;掌握在順序表,有序表,索引表,散列表等上的查找方法和算法,并能求出相應的平均查找長度;理解并掌握二叉排序樹,平衡二叉樹B-樹的各種算法。 9、排序(3學時)實驗十三 插入排序 實驗十四 選擇排序 實驗十五 排序綜合練習 要求:領會排序的基本思想和基本概念;理解并掌握插入排序,冒泡排序,快速排序,直接選擇排序,堆排序,歸并排序和基數排序的基本思想,步驟,算法及時空效率分析;了解外排序的定義和基本方法。 五、大綱說明 1、課堂講述的論題只是核心或有特色的知識內容,還有相當數量的篇章內容留給學生自學,所確定的自學部分內容亦屬考查范圍。 2、“數據結構”課注重上機訓練,所有作業都必須配有規范的文檔。上機訓練由平時的上機訓練和小學期的實訓課程設計兩部分組成。 3、課內學時安排說明:前8周每周4學時全為理論課,從第9周開始理論和上機為1:1,也即2學時理論,2學時上機訓練。 4、本課強調能力的培養,期末采用半開卷考試(允許同學攜帶一頁A4紙的總結資料)。本課成績由平時作業、上機成績(30%)和期末考試(70%)合成得到,有獨到見解的作業予以適當加分。 5、主要參考書: [1]《數據結構與算法教程》鄒永林 周蓓 唐曉陽 楊劍勇 編著 機械工業出版社 [2]《數據結構(C語言版)》(含CD)嚴蔚敏 吳為民 編著 清華大學出版社 [3]《數據結構習題集(C語言版)》嚴蔚敏 編著 清華大學出版社 [4]《數據結構習題解析與實訓》張世和 編著 清華大學出版社第三篇:PHP程序員
第四篇:數據結構與算法總結
第五篇:數據結構與算法教學大綱