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

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

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


前言

數(shù)據(jù)結(jié)構(gòu)棧和隊(duì)列。,c語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)


棧和隊(duì)列是一種特殊的線性結(jié)構(gòu),他與之前學(xué)的線性結(jié)構(gòu)不同,棧和隊(duì)列是擁有一種特殊規(guī)則的線性結(jié)構(gòu),雖然它是用數(shù)組或者鏈表實(shí)現(xiàn),但是只有符合這種規(guī)則才能被稱(chēng)作?;蛘哧?duì)列

一、棧

1.棧的概念及定義

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

數(shù)據(jù)結(jié)構(gòu)棧和隊(duì)列。,c語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

2.棧的實(shí)現(xiàn)

棧的實(shí)現(xiàn)有兩種實(shí)現(xiàn),但是我們可以想想棧的特點(diǎn),后進(jìn)先出,我們只對(duì)尾部操作,那么是不是用數(shù)組剛好合適,雖然用鏈表也可以,但是數(shù)組的尾插的損耗更加小一點(diǎn),所以我這里就一數(shù)組來(lái)進(jìn)行講解

數(shù)據(jù)結(jié)構(gòu)棧和隊(duì)列。,c語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)
我這里用動(dòng)態(tài)的數(shù)組來(lái)實(shí)現(xiàn)棧

(1)棧的結(jié)構(gòu)

typedef int STDataType;//方便存儲(chǔ)各種數(shù)據(jù)
typedef struct Stack
{
	STDataType* a;
	int top;//棧頂位置,如果等于capacity=0時(shí)為空
	int capacity;//容量
}ST;

(2)StackInit(初始化)

void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;//初始化時(shí)如果top是0,即top指向棧頂上的后一位,所以取出元素時(shí)需要減一
	ps->capacity = 0;
}

(3)StackPush(壓棧)

void StackPush(ST* ps, STDataType x)
{
		assert(ps);
		if (ps->top == ps->capacity)
		{
			int newcapacity = ps->capacity == 0 ? 4: ps->capacity * 2;
			STDataType* temp = (STDataType * )realloc(ps->a, sizeof(STDataType)*newcapacity);
			if (temp == NULL)
			{
				printf("realloc fail\n");
				exit(-1);
			}
			ps->a = temp;
			ps->capacity = newcapacity;
		}
		ps->a[ps->top] = x;
		ps->top++;

}

這里的代碼參考動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)

(4)StackPop(出棧)

void StackPop(ST* ps) 
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

(5)StackTop(取棧頂?shù)脑兀?/h4>
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];//這里需要減一是因?yàn)閠op指向棧頂上的后一位,如果還不理解就看初始化代碼
}

(6)StackEmpty(檢查棧是否為空)

布爾類(lèi)型的數(shù)據(jù)在c使用需要加stdbool頭文件

bool StackEmpty(ST* ps)
{
	return ps->top == 0;
}

(7)StackDestroy(銷(xiāo)毀棧)

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

3.完整代碼

(1)頭文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps,STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
bool StackEmpty(ST* ps);
 

(2)源文件

#include"Stack.h"
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;//初始化時(shí)如果top是0,即top指向棧頂上的后一位
	ps->capacity = 0;
}
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;

}
void StackPush(ST* ps, STDataType x)
{
		assert(ps);
		if (ps->top == ps->capacity)
		{
			int newcapacity = ps->capacity == 0 ? 4: ps->capacity * 2;
			STDataType* temp = (STDataType * )realloc(ps->a, sizeof(STDataType)*newcapacity);
			if (temp == NULL)
			{
				printf("realloc fail\n");
				exit(-1);
			}
			ps->a = temp;
			ps->capacity = newcapacity;
		}
		ps->a[ps->top] = x;
		ps->top++;

}
void StackPop(ST* ps) 
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}
bool StackEmpty(ST* ps)
{
	return ps->top == 0;
}

至此,棧算是搞完了,接下來(lái)講隊(duì)列

二、隊(duì)列

1.隊(duì)列的概念及定義

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

數(shù)據(jù)結(jié)構(gòu)棧和隊(duì)列。,c語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

2.隊(duì)列的實(shí)現(xiàn)

數(shù)據(jù)結(jié)構(gòu)棧和隊(duì)列。,c語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

隊(duì)列需要能夠?qū)︻^和尾操作,所以數(shù)組是不好實(shí)現(xiàn)的,我們用鏈表來(lái)實(shí)現(xiàn)

(1)隊(duì)列的結(jié)構(gòu)

隊(duì)列的特點(diǎn)與排隊(duì)購(gòu)物差不多,我們要能夠控制頭的出和尾的進(jìn),所以與棧不一樣,我們需要頭和尾的位置所以我們就要實(shí)現(xiàn)成下面的樣子

typedef int QDataType;
typedef struct QueueNode//隊(duì)列的節(jié)點(diǎn)
{
	struct QueueNode* next;
	QDataType data;
}QN;
typedef struct Queue//存儲(chǔ)了頭和尾,方便我們直接對(duì)頭和尾操作
{
	QN* head;
	QN* tail;
}Queue;

此處的實(shí)現(xiàn)可以參考我前面的文章鏈表

(2)QueueInit(初始化)

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
}

(3)QueuePush(入隊(duì))

尾入

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QN* newnode = (QN*)malloc(sizeof(QN));
	newnode->data = x;
	newnode->next = NULL;
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}

}

(4)QueuePop(出隊(duì))

頭出

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	QN* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	if (pq->head == NULL)
	{
		pq->tail = NULL;
	}
}

(5)QueueFront(獲取頭部元素)

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}

(6)QueueBack(獲取尾部元素)

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq->tail));
	return pq->tail->data;
}

(7)QueueEmpty(檢查隊(duì)列是否為空)

布爾類(lèi)型需要包括頭文件stdbool

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

3.完整代碼

(1)頭文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QN;
typedef struct Queue
{
	QN* head;
	QN* tail;
}Queue;

void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);

(2)源文件

#include"Queue.h"
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
}
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QN* cur = pq->head;
	while (cur)
	{
		QN* next = cur->next;
		free(cur);
		cur = next;
	}
}
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QN* newnode = (QN*)malloc(sizeof(QN));
	newnode->data = x;
	newnode->next = NULL;
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}

}
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	QN* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	if (pq->head == NULL)
	{
		pq->tail = NULL;
	}
}
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq->tail));
	return pq->tail->data;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

結(jié)語(yǔ)

好了,棧和隊(duì)列算是講完了,如果有什么不妥之處歡迎指正,謝謝文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-794159.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

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

    2024年02月04日
    瀏覽(21)
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)——線性表之棧和隊(duì)列

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)——線性表之棧和隊(duì)列

    為什么會(huì)定義棧和隊(duì)列這兩種數(shù)據(jù)結(jié)構(gòu)呢? 原因在于: 之所以會(huì)定義棧和隊(duì)列這樣的數(shù)據(jù)結(jié)構(gòu) 是因?yàn)樗麄冇袃纱筇匦?: 第一: 他們可以保存程序運(yùn)行路徑中各個(gè)點(diǎn)的信息,以便用于回溯操作或其他需要訪問(wèn)已經(jīng)訪問(wèn)過(guò)的節(jié)點(diǎn)信息的操作。 比如: 棧用于解決迷宮問(wèn)題,就

    2023年04月11日
    瀏覽(95)
  • 高效學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列篇(五千字超詳細(xì)教程)

    高效學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列篇(五千字超詳細(xì)教程)

    大家好呀我是小生??????今天我們來(lái)學(xué)習(xí) 數(shù)據(jù)結(jié)構(gòu)的棧和隊(duì)列 ,小生為了方便大家理解特意附上了 許多圖片和源碼 一起加油吧 ?????? ? 下面是我們今天要學(xué)習(xí)的內(nèi)容 ?????? ?一.棧 ? ? ? ? ?1.??棧的基本概念 ?2.??棧的結(jié)構(gòu)選擇 ??順序表和鏈表的優(yōu)缺點(diǎn)對(duì)比:

    2023年04月08日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列 - 超詳細(xì)的教程,手把手教你認(rèn)識(shí)并運(yùn)用棧和隊(duì)列

    數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列 - 超詳細(xì)的教程,手把手教你認(rèn)識(shí)并運(yùn)用棧和隊(duì)列

    棧:后進(jìn)先出 隊(duì)列:先進(jìn)先出 棧:是一種特殊的 線性表 , 只允許在固定的一端插入或者刪除元素 ,一個(gè)棧包含了棧頂和棧底。只能在棧頂插入或者刪除元素。 棧的底層 是由 數(shù)組 實(shí)現(xiàn)的。 棧遵循先入后出原則,也就是先插入的元素得到后面才能刪除,后面插入的元素比

    2024年02月07日
    瀏覽(89)
  • (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊(duì)列 c語(yǔ)言實(shí)現(xiàn)

    (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊(duì)列 c語(yǔ)言實(shí)現(xiàn)

    本章將會(huì)詳細(xì)講解以下知識(shí)點(diǎn): 目錄 一:棧 ? ? ? ? 1:棧的定義,棧的特點(diǎn) ? ? ? ? 2:用什么結(jié)構(gòu)來(lái)實(shí)現(xiàn)棧與原因的分析? ? ? ? ??3:? (超詳解)棧的常用接口并且附上測(cè)試用例 二:隊(duì)列 ? ? ? ? 1:隊(duì)列的定義,隊(duì)列的特點(diǎn) ? ? ? ? 2:用什么結(jié)構(gòu)來(lái)實(shí)現(xiàn)隊(duì)列與原因的分析

    2024年02月11日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】——棧與隊(duì)列(附加oj題詳解)深度理解

    【數(shù)據(jù)結(jié)構(gòu)】——棧與隊(duì)列(附加oj題詳解)深度理解

    1.棧的定義 棧: 棧是僅限與在表尾進(jìn)行插入或者刪除的 線性表 我們把 允許一端插入和刪除的一端叫做棧頂,另一端叫棧底,不含任何元素的棧叫做空棧 ,棧又叫做后進(jìn)先出的線性表,簡(jiǎn)稱(chēng) LIFO 結(jié)構(gòu) 2.棧的理解 對(duì)于定義里面的在表尾進(jìn)行插入和刪除, 這里的表尾就是棧頂,

    2024年03月26日
    瀏覽(21)
  • 《數(shù)據(jù)結(jié)構(gòu)》之棧和堆結(jié)構(gòu)及JVM簡(jiǎn)析

    《數(shù)據(jù)結(jié)構(gòu)》之棧和堆結(jié)構(gòu)及JVM簡(jiǎn)析

    在數(shù)據(jù)結(jié)構(gòu)中,我們第一了解到了棧或堆棧,它的結(jié)構(gòu)特點(diǎn)是什么呢?先進(jìn)后出,它的特點(diǎn)有什么用呢?我們?cè)谀睦锟梢允褂玫綏=Y(jié)構(gòu),棧結(jié)構(gòu)那么簡(jiǎn)單,使用這么久了為什么不用其它結(jié)構(gòu)替代? 作為一個(gè)程序猿,我們應(yīng)該會(huì)常常跟代碼打交道,那么我們所編寫(xiě)的程序或代碼

    2024年02月07日
    瀏覽(34)
  • 【數(shù)據(jù)結(jié)構(gòu)】--- 幾分鐘走進(jìn)棧和隊(duì)列(詳解-上)

    【數(shù)據(jù)結(jié)構(gòu)】--- 幾分鐘走進(jìn)棧和隊(duì)列(詳解-上)

    ?? 個(gè)人主頁(yè) :@小沈熬夜禿頭中???? ?? 小編介紹 :歡迎來(lái)到我的亂七八糟小星球?? ?? 專(zhuān)欄 :數(shù)據(jù)結(jié)構(gòu) ?? 本章內(nèi)容 :[數(shù)據(jù)結(jié)構(gòu)]—棧和隊(duì)列 送給各位 ??:一事無(wú)成也代表萬(wàn)事皆有可能 歡迎 評(píng)論?? +點(diǎn)贊?? +收藏?? +關(guān)注??哦~ 提示:以下是本篇文章正文內(nèi)容,

    2024年02月06日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列超詳解!(Stack && Queue)

    【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列超詳解!(Stack && Queue)

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

    2024年02月04日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包