データ構造:第3章学習まとめ
4698 ワード
1.内容のまとめ:
スタック(FILO)とキュー(FIFO)は、「エンドポイント」に限定された線形テーブルを挿入して削除し、順序記憶構造とチェーン記憶構造があります.
1.1スタック:
スタックの実現と基本操作:
スタックの応用はたくさんあります.ここで言うのは再帰です.
スタックと再帰を利用して、以下の3つの問題を解決できます.定義は再帰的であり、例えば、Fibonacci数列を印刷し、nの階乗を印刷する. データ構造は再帰的であり、本章で学んだようなスタック及び後に学ぶ広義表である. 問題の解法は再帰的なもので、例えばハノイタワー問題です. 再帰的な利点は十分に、ロジックが明確で、コードが簡潔です.しかし、再帰的には多くの時間と空間が消費され、時には計算を繰り返す問題がある.
1.2キュー
キューの実現と基本操作:
問題を完成したら、時間と空間に対する考えを重視しなければなりません.時には問題が提示されなくても、ちょっとした工夫で時間と空間を節約することができます.
3.資料の紹介:
基礎的な知識は教科書を見てもいいし、コミュニティやウェブサイトを見てもいいです.
4.前段階の完成状況とその後の目標:
前の段階の目標はこの章をマスターするので、基本的に完成して、足りないのは再帰に対してまだ熟知していません.
後続の目標はもちろん第四章をマスターすることです.
スタック(FILO)とキュー(FIFO)は、「エンドポイント」に限定された線形テーブルを挿入して削除し、順序記憶構造とチェーン記憶構造があります.
1.1スタック:
スタックの実現と基本操作:
1 :
2 #define MAXSIZE 100//
3 typedef struct{
4 SElemType *base;//
5 SElemType *top; //
6 int stacksize; //
7 }SqStack;
8
9 Status InitStack(SqStack &s){
10 s.base = new SElemType[MAXSIZE];//
11 if(!s.base) exit(OVERFLOW); //
12 s.top = s.base; //top base,
13 s.stacksize = MAXSIZE; //stacksize
14 return OK;
15 } 16 17 Status Push(SqStack &s, SElemType e){ 18 if(s.top - s.base == s.stacksize){// 19 return ERROR; 20 } 21 *s.top++ = e; //e( ) ,( ) 1 22 return OK; 23 } 24 25 Status Pop(SqStack &s, SElemType &e){ 26 if(s.top == s.base){ // 27 return ERROR; 28 } 29 e = *--s.top; // ( ) 1,( ) e 30 } 31 32 33 : 34 typedef struct StackNode{ 35 ElemType data; 36 StackNode *next; 37 }StackNode, *LinkStack; 38 39 Status InitStack(LinkStack &s){// 40 s = NULL; 41 return OK; 42 } 43 44 Status Push(LinkStack &s, SElemType e){// FILO , , 45 StackNode *p = new StackNode; 46 p -> data = e; 47 p ->next = s; 48 s = p; 49 return OK; 50 } 51 52 Status Pop(LinkStack &s, SElemType &e){ 53 if(s == NULL) return ERROR;// 54 e = s -> data; 55 StackNode *temp = s; 56 s = s -> next; 57 delete temp; // 58 return OK; 59 }
スタックの適用:スタックの応用はたくさんあります.ここで言うのは再帰です.
スタックと再帰を利用して、以下の3つの問題を解決できます.
1.2キュー
キューの実現と基本操作:
1 :
2 #define MAXSIZE 100 //
3 typedef struct{
4 QElemType *base; //
5 int front; //
6 int rear; //
7 }SqQueue;
8
9 Status IninQueue(SqQueue &q){ //
10 q.base = new QElemType[MAXSIZE];
11 if(!q.base) exit(OVERFLOW); //
12 q.front = q.rear = 0;
13 return OK; 14 } 15 16 Status Enter(SqQueue &q, QElemtype e){ 17 if( (q.rear + 1) % MAXSIZE == q.front){// 1 18 return ERROR;// 19 } 20 q.base[q.rear] = e; // 21 q.rear = (q.rear + 1) % MAXSIZE; // 1 22 return OK; 23 } 24 25 Status Exit(SqQueue &q, QElemtype &e){ 26 if(q.front == q.rear) return ERROR;// 27 e = q.base[q.front]; 28 q.front = (q.front + 1) % MAXSIZE;// 1 29 return OK; 30 } 31 32 : 33 typedef struct QNode{ 34 QElemType data; 35 struct QNode *next; 36 }QNode; 37 typedef struct{ 38 QNode *front; // 39 QNode *rear; // 40 }LinkQueue; 41 42 Status InitQueue(LinkQueue &q){ 43 q.front = q.rear = new QNode; // 44 q.front -> next = NULL; 45 return OK; 46 } 47 48 Status Enter(LinkQueue &q, QElemType e){ 49 QNode *p = new QNode; 50 p -> data = e; 51 p -> next = NULL; 52 q.rear -> next = p; // 53 q.rear = p;// 54 return OK; 55 } 56 57 Status Exit(LinkQueue &q, QElemType &e){ 58 if(q.front == q.rear) return ERROR;// 59 QNode *p = q.front -> next; //p 60 e = p -> data; 61 q.front -> next = p -> next; // 62 if(q.rear == p) q.rear = q.front; // , 63 delete p; 64 return OK; 65 }
2.心得:問題を完成したら、時間と空間に対する考えを重視しなければなりません.時には問題が提示されなくても、ちょっとした工夫で時間と空間を節約することができます.
3.資料の紹介:
基礎的な知識は教科書を見てもいいし、コミュニティやウェブサイトを見てもいいです.
4.前段階の完成状況とその後の目標:
前の段階の目標はこの章をマスターするので、基本的に完成して、足りないのは再帰に対してまだ熟知していません.
後続の目標はもちろん第四章をマスターすることです.