国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

前言

前面兩篇文章講述了關(guān)于線性表中的順序表與鏈表,這篇文章繼續(xù)講述線性表中的棧和隊列。
這里講述的兩種線性表與前面的線性表不同,只允許在一端入數(shù)據(jù),一段出數(shù)據(jù),詳細(xì)內(nèi)容請看下面的文章。
順序表與鏈表兩篇文章的鏈接:
線性表之順序表
線性表之鏈表

注意: 本文提到的效率全部為空間復(fù)雜度?。。。?/p>

一、棧

1. 棧的概念

:一種特殊的線性表,其只允許固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO (Last ln FirstOut)的原則.
入棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。
出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)也在棧頂。


2. 棧的結(jié)構(gòu)

棧的結(jié)構(gòu)決定了棧只能在棧頂入數(shù)據(jù),棧頂出數(shù)據(jù),并且遵循著后進(jìn)先出的原則。

2.1 選擇數(shù)據(jù)結(jié)構(gòu)完成棧(數(shù)組 or 鏈表)

2.1.1 數(shù)組

前面學(xué)習(xí)過順序表就能知道,數(shù)組只有尾插和尾刪的效率高O(1) , 而靠近頭的位置的插入刪除的效率比較低為O(N)。
而對于棧這種只能在棧頂插入、刪除的數(shù)據(jù)結(jié)構(gòu)可謂是完美契合數(shù)組的優(yōu)點
【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列


2.1.2 鏈表

前面學(xué)習(xí)過鏈表就可以知道,對于單鏈表的頭插、頭刪的效率非常高為 O(1) , 而它的尾插、尾刪需要找尾,效率比較低為 O(N)。

若以單鏈表的頭為棧底,尾為棧頂,則入棧、出棧相當(dāng)于單鏈表的尾插、尾刪效率并不高。
顯然這不是我們的最佳選項,但是若用一個變量記錄尾的情況下,尾插、尾刪的效率也可以達(dá)到O(1)。

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

若以單鏈表的頭為棧頂,尾為棧底,則入棧、出棧相當(dāng)于單鏈表的頭插、頭刪效率非常高為O(1)。
這里與前面的數(shù)組差不多,也是棧的操作完全契合單鏈表的優(yōu)點。

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列
棧能夠使用單鏈表實現(xiàn),當(dāng)然也可以用帶頭雙向循環(huán)鏈表實現(xiàn),但是我認(rèn)為這里使用帶頭雙向循環(huán)鏈表有點大炮打蚊子,大材小用的感覺。


2.1.3 我選擇用數(shù)組完成棧

為什么這里選擇數(shù)組完成呢?
明明數(shù)組容量不足時擴(kuò)容需要消耗,而鏈表沒有這個消耗,為什么不用鏈表?
原因有以下幾點:

  1. 由于數(shù)組物理結(jié)構(gòu)上是連續(xù)的,緩存命中率高,訪問效率高。
  2. 相比鏈表,數(shù)組只需要存儲數(shù)據(jù),而鏈表每一個節(jié)點還需要存下一個節(jié)點的地址。
  3. 雖然數(shù)組擴(kuò)容有消耗,但是鏈表每次申請節(jié)點的時候也會有消耗。

2.2 棧的操作

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列


3. 棧的實現(xiàn)

Stack.h頭文件的實現(xiàn)
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

// 支持動態(tài)增長的棧
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);
// 獲取棧中有效元素個數(shù) 
int StackSize(Stack* ps);
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
int StackEmpty(Stack* ps);
// 銷毀棧 
void StackDestroy(Stack* ps);
Stack.c文件的實現(xiàn)

3.1 初始化棧

棧的初始化將傳入函數(shù)的結(jié)構(gòu)體進(jìn)行初始化:
a. 棧頂初始化的時候注意有兩種情況:
1. top指向棧頂元素
2. top指向棧頂元素的后面一個位置
當(dāng)然都可以,我選擇 1 僅僅方便我自己理解

b. 是否在初始化的時候給棧申請部分空間
當(dāng)然都可以,我這里選擇不申請空間,在后面用realloc函數(shù)申請和擴(kuò)容空間。

// 初始化棧 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->capacity = 0;
	//ps->top = -1;    //top指向棧頂
	ps->top = 0;     //top指向棧頂?shù)暮竺嬉粋€元素
	ps->a = NULL;
}

3.2 入棧

當(dāng)數(shù)據(jù)入棧時需要判斷棧是否為滿,若為滿則需要擴(kuò)容,這里的StackFull函數(shù)其實并沒有必要,由于棧只有尾插這一個插入操作不需要復(fù)用擴(kuò)容操作,所以可以直接寫在入棧操作中。
注意:
當(dāng)realloc()函數(shù)的參數(shù)為NULL時,其作用與malloc()函數(shù)的作用一樣。

void StackFull(Stack* ps)
{
	assert(ps);
	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
	if (tmp == NULL)
	{
		perror("realloc");
		return;
	}
	ps->a = tmp;
	ps->capacity = newcapacity;
}

// 入棧 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);

	if (ps->capacity == ps->top)
		StackFull(ps);
	ps->a[ps->top] = data;
	ps->top++;
}

3.3 判空

前面假設(shè)了top指向棧頂元素后面一個位置,所以當(dāng) top 指向 0 的時候棧是空的。

// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);

	return ps->top == 0;
}

3.4 出棧

執(zhí)行出棧操作時,棧不能為空,且只需要 top-- , 不需要將其數(shù)據(jù)抹除。

// 出棧 
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	//棧為空,則不能繼續(xù)出棧
	ps->top--;
}

3.5 取棧頂元素

與出棧操作一樣,取棧頂元素時,棧不能為空。
top是指向棧頂元素后面一個位置,所以取棧頂元素時取的是 top - 1 指向的元素。

// 獲取棧頂元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	//棧為空,則無棧頂元素
	return ps->a[ps->top - 1];
}


3.6 獲取棧中有效元素個數(shù)

由于top是指向棧頂元素的下一個位置,而元素個數(shù)正好是下標(biāo) + 1 ,也就是top。

// 獲取棧中有效元素個數(shù) 
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->top;   //由于top是指向棧頂元素的下一個位置		
					  //而元素個數(shù)正好是下標(biāo) + 1 ,也就是top
}

3.7 銷毀棧

// 銷毀棧 
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;

	ps->capacity = 0;
	ps->top = 0;
}

4. 整體代碼的實現(xiàn)

#include "Stack.h"
// 初始化棧 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->capacity = 0;
	ps->top = 0;     //top指向棧頂?shù)暮竺嬉粋€元素
	ps->a = NULL;
}

void StackFull(Stack* ps)
{
	assert(ps);
	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
	if (tmp == NULL)
	{
		perror("realloc");
		return;
	}
	ps->a = tmp;
	ps->capacity = newcapacity;
}

// 入棧 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);

	if (ps->capacity == ps->top)
		StackFull(ps);
	ps->a[ps->top] = data;
	ps->top++;
}

// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);

	return ps->top == 0;
}

// 出棧 
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	//棧為空,則不能繼續(xù)出棧
	ps->top--;
}

// 獲取棧頂元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	//棧為空,則無棧頂元素
	return ps->a[ps->top - 1];
}

// 獲取棧中有效元素個數(shù) 
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->top;   //由于top是指向棧頂元素的下一個位置		
					  //而元素個數(shù)正好是下標(biāo) + 1 ,也就是top
}

// 銷毀棧 
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;

	ps->capacity = 0;
	ps->top = 0;
}

二、隊列

1. 隊列的概念

隊列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有 先進(jìn)先出 FIFO(First In First Out) 的原則。
入隊列:進(jìn)行插入操作的一端稱為隊尾
出隊列:進(jìn)行刪除操作的一端稱為隊頭


2. 隊列的結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

2.1 選擇數(shù)據(jù)結(jié)構(gòu)完成隊列(數(shù)組 or 鏈表)

2.1.1 數(shù)組

前面學(xué)習(xí)過順序表就能知道,數(shù)組只有尾插和尾刪的效率高O(1) , 而靠近頭的位置的插入刪除的效率比較低為O(N)。
而對于隊列這種只能在隊尾插入、對頭刪除的數(shù)據(jù)結(jié)構(gòu),無論隊頭和隊尾定義在哪,使用數(shù)組完成必定會有頭刪或頭插,會使得隊列的效率降低,所以不建議使用數(shù)組完成。

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列


2.1.2 鏈表

前面學(xué)習(xí)過鏈表就可以知道,對于單鏈表的頭插、頭刪的效率非常高為 O(1) , 而它的尾插、尾刪需要找尾,效率比較低為 O(N)。

(1)若以單鏈表的頭為隊頭,尾為隊尾,則入隊列、出隊列相當(dāng)于單鏈表的尾插、頭刪效率并不高。
(2)若以單鏈表的頭為隊尾,尾為隊頭,則入隊列、出隊列相當(dāng)于單鏈表的頭插、尾刪效率并不高。
雖然兩種情況都有一種操作效率為O(N) , 但是這兩種情況都是與尾有關(guān)的操作,
所以只要在結(jié)構(gòu)體中定一個記錄尾的成員,那么尾插、尾刪的效率就能達(dá)到O(1).

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列


2.1.3 我選擇用鏈表完成隊列

為什么這里選擇鏈表完成隊列?
通過上面的講述原因已經(jīng)顯而易見了。
原因如下:
由于無論怎么改造數(shù)組都會有一個操作效率為 O(N),而鏈表只需要改變結(jié)構(gòu)體,使其多一個指向尾的成員,就能使隊列的插入、刪除的操作效率為O(1).


3. 隊列的實現(xiàn)

Queue.h頭文件的實現(xiàn)
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int QDataType;

// 鏈?zhǔn)浇Y(jié)構(gòu):表示隊列 
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;

// 隊列的結(jié)構(gòu) 
typedef struct Queue
{
	QNode* front;
	QNode* rear;  //指向隊列最后一個元素的后面
	int size;
}Queue;

// 初始化隊列 
void QueueInit(Queue* q);
// 隊尾入隊列 
void QueuePush(Queue* q, QDataType data);
// 隊頭出隊列 
void QueuePop(Queue* q);
// 獲取隊列頭部元素 
QDataType QueueFront(Queue* q);
// 獲取隊列隊尾元素 
QDataType QueueBack(Queue* q);
// 獲取隊列中有效元素個數(shù) 
int QueueSize(Queue* q);
// 檢測隊列是否為空,如果為空返回非零結(jié)果,如果非空返回0 
int QueueEmpty(Queue* q);
// 銷毀隊列 
void QueueDestroy(Queue* q);
Queue.c文件的實現(xiàn)
3.1 初始化隊列

這里隊列的front指向隊頭rear指向隊尾。
當(dāng)隊列為的時候,那么frontrear 都是指向 NULL。

// 初始化隊列 
void QueueInit(Queue* q)
{
	q->front = NULL;
	q->rear = NULL;
	q->size = 0;
}

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列


3.2 隊尾入隊列

由于使用鏈表實現(xiàn)隊列,插入時需要申請一個節(jié)點。
入隊列分為兩種情況:

  1. 隊列為空時,需要改變隊頭、隊尾的指針。
  2. 隊列不為空時,只需要將新節(jié)點接到隊尾,并將尾指針向后移動即可。
// 隊尾入隊列 
void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc");
		return;
	}
	newnode->next = NULL;
	newnode->data = data;

	if (q->front == NULL)      //分隊列是否有元素兩種情況
	{						   //隊列為空
		assert(q->rear == NULL);
		q->front = newnode;
		q->rear = newnode;
	}
	else
	{						   //隊列不為空
		q->rear->next = newnode;
		q->rear = newnode;
	}

	q->size++;//入隊列,隊列長度加一
}

3.3 判空

當(dāng)隊列中的頭、尾指針都指向NULL的時候為隊列為空

// 檢測隊列是否為空,如果為空返回非零結(jié)果,如果非空返回0 
int QueueEmpty(Queue* q)
{
	assert(q);
	return q->front == NULL && q->rear == NULL;
}

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列

3.4 隊頭出隊列

出隊列分為兩種情況:

  1. 隊列中只有一個元素時:刪除最后一個節(jié)點,并將 frontrear 指向 NULL。
  2. 隊列中有多個元素時:刪除 front 指向的節(jié)點,并將 front 向后移動。
// 隊頭出隊列 
void QueuePop(Queue* q)
{
	assert(q);
	//出隊列時,隊列不能為空
	assert(!QueueEmpty(q));

	//當(dāng)隊列中只有一個元素的時候,不僅僅頭指針需要改變,尾指針也需要改變
	//因為當(dāng)刪除最后一個元素時,首指針釋放當(dāng)前節(jié)點,并向后移動,而尾指針并沒有移動
	//當(dāng)釋放后若在插入元素時,尾指針會造成野指針的情況
	if (q->front->next == NULL)
	{
		QNode* del = q->front;
		q->front = NULL;
		q->rear = NULL;
		free(del);
	}
	else
	{
		QNode* del = q->front;
		q->front = q->front->next;
		free(del);
	}
	q->size--;
}
3.5 獲取隊列頭部元素

front 指向的節(jié)點存儲著頭部元素。

// 獲取隊列頭部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	//獲取隊列頭部元素時,隊列不能為空
	assert(!QueueEmpty(q));

	return q->front->data;
}
3.6 獲取隊列隊尾元素

rear 指向的節(jié)點存儲著尾元素。

// 獲取隊列隊尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	//獲取隊列頭部元素時,隊列不能為空
	assert(!QueueEmpty(q));

	return q->rear->data;
}
3.7 獲取隊列中有效元素個數(shù)

結(jié)構(gòu)體中的 size 存儲著隊列中的有效元素個數(shù)

// 獲取隊列中有效元素個數(shù) 
int QueueSize(Queue* q)
{
	assert(q);
	//結(jié)構(gòu)體中定義了一個size
	//而這里遍歷鏈表得到個數(shù),效率低O(N)
	/*int size = 0;  不要用
	QNode* cur = q->front;
	while (cur != q->rear)
	{
		size++;
		q->front = q->front->next;
	}*/
	return q->size;
}
3.8 銷毀隊列

銷毀隊列與前面銷毀單鏈表相同,需要將每一個節(jié)點都釋放。

// 銷毀隊列 
void QueueDestroy(Queue* q)
{
	assert(q);
	QNode* cur = q->front;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
}

4. 整體代碼的實現(xiàn)

// 初始化隊列 
void QueueInit(Queue* q)
{
	q->front = NULL;
	q->rear = NULL;
	q->size = 0;
}

// 隊尾入隊列 
void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc");
		return;
	}
	newnode->next = NULL;
	newnode->data = data;

	if (q->front == NULL)      //分隊列是否有元素兩種情況
	{
		assert(q->rear == NULL);
		q->front = newnode;
		q->rear = newnode;
	}
	else
	{
		q->rear->next = newnode;
		q->rear = newnode;
	}

	q->size++;//入隊列,隊列長度加一
}

// 檢測隊列是否為空,如果為空返回非零結(jié)果,如果非空返回0 
int QueueEmpty(Queue* q)
{
	assert(q);
	return q->front == NULL && q->rear == NULL;
}

// 隊頭出隊列 
void QueuePop(Queue* q)
{
	assert(q);
	//出隊列時,隊列不能為空
	assert(!QueueEmpty(q));

	//當(dāng)隊列中只有一個元素的時候,不僅僅頭指針需要改變,尾指針也需要改變
	//因為當(dāng)刪除最后一個元素時,首指針釋放當(dāng)前節(jié)點,并向后移動,而尾指針并沒有移動
	//當(dāng)釋放后若在插入元素時,尾指針會造成野指針的情況
	if (q->front->next == NULL)
	{
		QNode* del = q->front;
		q->front = NULL;
		q->rear = NULL;
		free(del);
	}
	else
	{
		QNode* del = q->front;
		q->front = q->front->next;
		free(del);
	}
	q->size--;
}

// 獲取隊列頭部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	//獲取隊列頭部元素時,隊列不能為空
	assert(!QueueEmpty(q));

	return q->front->data;
}

// 獲取隊列隊尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	//獲取隊列頭部元素時,隊列不能為空
	assert(!QueueEmpty(q));

	return q->rear->data;
}


// 獲取隊列中有效元素個數(shù) 
int QueueSize(Queue* q)
{
	assert(q);

	//結(jié)構(gòu)體中定義了一個size
	//而這里遍歷鏈表得到個數(shù),效率低
	/*int size = 0;    不要用
	QNode* cur = q->front;
	while (cur != q->rear)
	{
		size++;
		q->front = q->front->next;
	}*/
	return q->size;
}

// 銷毀隊列 
void QueueDestroy(Queue* q)
{
	assert(q);
	QNode* cur = q->front;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
}

結(jié)尾

注意: 本文提到的效率全部為空間復(fù)雜度?。。。?br> 如果有什么建議和疑問,或是有什么錯誤,大家可以在評論區(qū)中提出。
希望大家以后也能和我一起進(jìn)步??!????
如果這篇文章對你有用的話,希望大家給一個三連??!????

【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列文章來源地址http://www.zghlxwxcb.cn/news/detail-457761.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)——線性表之順序表

    數(shù)據(jù)結(jié)構(gòu)——線性表之順序表

    目錄 一.線性表 二.順序表實現(xiàn) ?2.1 概念及結(jié)構(gòu) ?2.2 動態(tài)順序表 2.2.1 初始化與銷毀函數(shù) 2.2.2 打印函數(shù) 2.2.3?尾插函數(shù) 2.2.4 尾刪函數(shù) 2.2.5 擴(kuò)容函數(shù) 2.2.6 頭插函數(shù) 2.2.7 頭刪函數(shù) 2.2.8 任意位置插入函數(shù) 2.2.9 查找函數(shù) 2.2.10 任意位置刪除函數(shù)? 2.2.11 修改函數(shù) 三.完整代碼 四.力扣

    2024年02月07日
    瀏覽(87)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

    【數(shù)據(jù)結(jié)構(gòu)】線性表之順序表

    線性表是 n (n = 0) 個具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊列… 線性表在 邏輯上是線性結(jié)構(gòu) ,也就說是連續(xù)的一條直線。但是在 物理結(jié)構(gòu) 上并 不一定 是連續(xù)的線性表在物理上存儲時,通常以

    2024年02月04日
    瀏覽(91)
  • 數(shù)據(jù)結(jié)構(gòu)之棧、隊列——算法與數(shù)據(jù)結(jié)構(gòu)入門筆記(四)

    數(shù)據(jù)結(jié)構(gòu)之棧、隊列——算法與數(shù)據(jù)結(jié)構(gòu)入門筆記(四)

    本文是算法與數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)筆記第四篇,將持續(xù)更新,歡迎小伙伴們閱讀學(xué)習(xí) 。有不懂的或錯誤的地方,歡迎交流 棧是一種線性數(shù)據(jù)結(jié)構(gòu),其 只允許在固定的一端進(jìn)行插入和刪除 元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂 (Top), 另一端稱為棧底 (Bottom)。棧中的

    2024年02月08日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)之棧與隊列詳解

    數(shù)據(jù)結(jié)構(gòu)之棧與隊列詳解

    棧和隊列是一種特殊的線性結(jié)構(gòu),他與之前學(xué)的線性結(jié)構(gòu)不同,棧和隊列是擁有一種特殊規(guī)則的線性結(jié)構(gòu),雖然它是用數(shù)組或者鏈表實現(xiàn),但是只有符合這種規(guī)則才能被稱作棧或者隊列 棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和

    2024年01月16日
    瀏覽(32)
  • 數(shù)據(jù)結(jié)構(gòu):線性表之-單向鏈表(無頭)

    數(shù)據(jù)結(jié)構(gòu):線性表之-單向鏈表(無頭)

    目錄 什么是單向鏈表 順序表和鏈表的區(qū)別和聯(lián)系 順序表: 鏈表: 鏈表表示(單項)和實現(xiàn) 1.1 鏈表的概念及結(jié)構(gòu) 1.2單鏈表(無頭)的實現(xiàn) 所用文件 將有以下功能: 鏈表定義 創(chuàng)建新鏈表元素 尾插 頭插 尾刪 頭刪 查找-給一個節(jié)點的指針 改 pos位置之前插入 刪除pos位置的值 成品

    2024年02月09日
    瀏覽(96)
  • 數(shù)據(jù)結(jié)構(gòu)之棧和隊列---c++

    數(shù)據(jù)結(jié)構(gòu)之棧和隊列---c++

    棧 棧是一個“先進(jìn)后出”結(jié)構(gòu) 隊列 入隊演示 隊列是一種“先進(jìn)先出”的結(jié)構(gòu) 出隊演示 接下來我們開始本次的內(nèi)容 分析 1.我們可以 老老實實的寫一個棧 然后將所有的接口函數(shù)實現(xiàn)出來,最后再進(jìn)行實現(xiàn)隊列,但是顯然是 效率低下 的方法 2.我們使用 數(shù)組模擬棧 ,然后再進(jìn)

    2024年02月14日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)奇妙旅程之棧和隊列

    數(shù)據(jù)結(jié)構(gòu)奇妙旅程之棧和隊列

    ??????? write in front???????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請多多諒解,讓我們一起共同進(jìn)步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie??????????原創(chuàng) CSDN?如需轉(zhuǎn)載還請通知???? 個人主頁:xiaoxie??

    2024年02月04日
    瀏覽(21)
  • C數(shù)據(jù)結(jié)構(gòu)-線性表之順序表

    C數(shù)據(jù)結(jié)構(gòu)-線性表之順序表

    首先我們創(chuàng)建3個文件,分別如下: liner_data --sqlist.c --sqlist.h --test.c 下面編寫sqlist.c文件:函數(shù)實現(xiàn)的功能 test.c文件:main函數(shù)的執(zhí)行入口 c語言程序編譯的過程如下: 預(yù)編譯-編譯-匯編-連接 匯編:gcc -c sqlist.c -o sqlist.o gcc -c test.c -o test.o 連接:可執(zhí)行文件:gcc sqlist.o test.o -o

    2024年02月09日
    瀏覽(573)
  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)分享之棧和隊列詳解

    數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)分享之棧和隊列詳解

    ??博主CSDN主頁:杭電碼農(nóng)-NEO?? ? ?專欄分類:數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)分享? ? ??代碼倉庫:NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你了解更多數(shù)據(jù)結(jié)構(gòu)的知識 ? ???? 這一節(jié)要分享的是一個全新的結(jié)構(gòu)–棧和隊列,棧和隊列總是會一起出現(xiàn),因為它們的存儲方式剛好相反,一個先進(jìn)先出一

    2024年02月03日
    瀏覽(39)
  • Java------數(shù)據(jù)結(jié)構(gòu)之棧與隊列(簡單講解)

    Java------數(shù)據(jù)結(jié)構(gòu)之棧與隊列(簡單講解)

    本篇碎碎念 :時隔n個月,繼續(xù)寫博客,假期落下的進(jìn)度,在開學(xué)后努力追趕, 假期不努力,開學(xué)徒傷悲啊,此時此刻真想對自己說一句,活該啊~~~~ 欠下的鏈表練習(xí)題講解會在下次更新~~~~ 今日份勵志文案: ?萬物皆有裂痕,那是光照進(jìn)來的地方 棧:一種特殊的線性表,其只允

    2024年04月14日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包