目錄
?編輯
棧:
棧的概念及結構:
?棧的實現:
隊列:
隊列的概念及結構:
?隊列的實現:
擴展知識:
?以上就是個人學習線性表的個人見解和學習的解析,歡迎各位大佬在評論區探討!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
棧:
棧的概念及結構:
????????棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端 稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。一般用在1.公平性排隊(抽號機);2.BFS(廣度優先遍歷)。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據也在棧頂。
?棧的實現:
????????棧的實現一般可以使用數組或者鏈表實現,相對而言數組的結構實現更優一些。因為數組在尾上插入數據的代價比較小。鏈的尾插需要調動更多的數據,過程中有更多的消耗。
// 支持動態增長的棧typedef int STDataType ;typedef struct Stack{STDataType * _a ;int _top ; // 棧頂int _capacity ; // 容量} Stack ;// 初始化棧void StackInit ( Stack * ps );// 入棧void StackPush ( Stack * ps , STDataType data );// 出棧void StackPop ( Stack * ps );// 獲取棧頂元素STDataType StackTop ( Stack * ps );// 獲取棧中有效元素個數int StackSize ( Stack * ps );// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回 0int StackEmpty ( Stack * ps );// 銷毀棧void StackDestroy ( Stack * ps );
?//初始化棧
//初始化
void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}
//入棧
//入棧
void SLPush(SL* ps, STDataType x)
{assert(ps);//棧頂=容量說明需要擴容if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}ps->capacity = newcapacity;ps->a = tmp;}ps->a[ps->top] = x;//后綴++方便下一次入棧和打印棧頂ps->top++;
}
//出棧
//出棧
void SLPop(SL* ps)
{assert(ps);//為空情況“0”assert(ps->top > 0);//--ps->top;
}
//獲得棧頂元素
//獲得棧頂元素
STDataType SLTTop(SL* ps)
{assert(ps);//為空情況“0”assert(ps->top > 0);int n = (ps->top) - 1;return ps->a[n];
}
?//獲取棧中有效元素個數
//獲取棧中有效元素個數
int SLSize(SL* ps)
{assert(ps);return ps->top;
}
//銷毀棧
//銷毀棧
void SLDestroy(SL* ps)
{assert(ps);//開辟數組優勢:一次全部釋放free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}
// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
bool SLEmpty(SL* ps)
{assert(ps);//為“0”說明為NULLif (ps->top == 0){return true;}return false;
}
隊列:
隊列的概念及結構:
?隊列的實現:
????????隊列也可以數組和鏈表的結構實現,使用鏈表的結構實現更優一些,因為如果使用數組的結構,出隊列在數 組頭上出數據,效率會比較低。
// 鏈式結構:表示隊列typedef struct QListNode{struct QListNode * _pNext ;QDataType _data ;} QNode ;// 隊列的結構typedef struct Queue{QNode * _front ;QNode * _rear ;} Queue ;// 初始化隊列void QueueInit ( Queue * q );// 隊尾入隊列void QueuePush ( Queue * q , QDataType data );// 隊頭出隊列void QueuePop ( Queue * q );// 獲取隊列頭部元素QDataType QueueFront ( Queue * q );// 獲取隊列隊尾元素QDataType QueueBack ( Queue * q );// 獲取隊列中有效元素個數int QueueSize ( Queue * q );// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回 0int QueueEmpty ( Queue * q );// 銷毀隊列void QueueDestroy ( Queue * q );
//初始化
//初始化
void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}
//入列
//入列
void QueuePush(Que* pq, Qdatatype x)
{assert(pq);//開辟隊列結構動態內存Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//第一次或N+1次if (pq->tail == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}
//出列
//出列
void QueuePop(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->head->next == NULL){//就剩下一個free(pq->head);pq->head = pq->tail = NULL;}else{//剩下兩個及以上Que * del = pq->head;pq->head = pq->head->next;free(del);}pq->size--;
}
// 獲取隊列頭部元素?
// 獲取隊列頭部元素
Qdatatype QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}
// 獲取隊列隊尾元素?
// 獲取隊列隊尾元素
Qdatatype QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}
// 獲取隊列中有效元素個數?
// 獲取隊列中有效元素個數
int QueueSize(Que* pq)
{assert(pq);return pq->size;
}
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0?
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0
int QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;
}
//銷毀
//銷毀
void QueueDestroy(Que* pq)
{assert(pq);while (pq->head){Que* del = pq->head->next;free(pq->head);pq->head = del;pq->size--;}pq->head = pq->tail = NULL;
}
擴展知識:
????????隊列適合使用鏈表實現,使用順序結構(即固定的連續空間)實現時會出現假溢出的問題,因此大佬們設計出了循環隊列,循環隊列就是為了解決順序結構實現隊列假溢出問題的
????????循環隊列:實際中我們有時還會使用一種隊列叫循環隊列。如操作系統課程講解生產者消費者模型時可以就會使用循環隊列。環形隊列可以使用數組實現,也可以使用循環鏈表實現。
?
????????同時指向一個位置為空,rear(尾)的下一個位置為front(頭)時說明已經填滿,此處是多開辟了一個空間來做判斷是否為滿?!!!
?以上就是個人學習線性表的個人見解和學習的解析,歡迎各位大佬在評論區探討!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??