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

帶你深入理解“?!保╟語言 c++和stl Stack三個(gè)版本的模擬實(shí)現(xiàn))

這篇具有很好參考價(jià)值的文章主要介紹了帶你深入理解“棧”(c語言 c++和stl Stack三個(gè)版本的模擬實(shí)現(xiàn))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一.棧的概念及結(jié)構(gòu)

二.棧的實(shí)現(xiàn)(c語言版)

2.1靜態(tài)增長的棧

2.2動(dòng)態(tài)增長的棧

2.3動(dòng)態(tài)棧的模擬實(shí)現(xiàn)

? ?1.棧的初始化

? 2.入棧

?3.出棧

4.獲取棧頂元素

5.獲取棧中有效數(shù)據(jù)個(gè)數(shù)

6.檢查棧是否為空

7.棧的銷毀

三.C++ 版本模擬實(shí)現(xiàn)棧

?1.C++版本的源代碼

四.c語言版本的源代碼

? 4.1? 頭文件.h源碼

? 4.2?功能實(shí)現(xiàn)的.c文件

4.3測試代碼test.c文件


一.棧的概念及結(jié)構(gòu)

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

壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。
出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)也在棧頂

帶你深入理解“?!保╟語言 c++和stl Stack三個(gè)版本的模擬實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),c++,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c語言

二.棧的實(shí)現(xiàn)(c語言版)

棧的實(shí)現(xiàn)一般可以使用數(shù)組或者鏈表實(shí)現(xiàn),相對(duì)而言數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些。因?yàn)閿?shù)組在尾上插入數(shù)據(jù)的代價(jià)比較小

帶你深入理解“?!保╟語言 c++和stl Stack三個(gè)版本的模擬實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),c++,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c語言

2.1靜態(tài)增長的棧

下面是定長的靜態(tài)棧的結(jié)構(gòu),棧的內(nèi)存空間是固定的,當(dāng)我們棧中的數(shù)據(jù)很少時(shí),可能會(huì)浪費(fèi)空間,而數(shù)據(jù)量很大的時(shí)候,棧有可能占不下大量的數(shù)據(jù),所以,在實(shí)際中一般不實(shí)用。

typedef int STDataType;
#define N 10
typedef struct Stack
{
STDataType _a[N];
int _top; // 棧頂
}Stack;

2.2動(dòng)態(tài)增長的棧

下面是動(dòng)態(tài)增長的棧,初始化的時(shí)候可以先給_a一個(gè)固定的小值,如何根據(jù)用戶輸入的數(shù)據(jù)自我進(jìn)行擴(kuò)容

typedef int STDataType;

typedef struct Stack
{
STDataType* _a;
int _top; // 棧頂
int _capacity; // 容量
}Stack;

2.3動(dòng)態(tài)棧的模擬實(shí)現(xiàn)

? ?1.棧的初始化

? 在這里我對(duì)“?!钡娜萘拷o予5,然后用malloc去堆上創(chuàng)建5個(gè)int字節(jié)大小的空間付給我們的數(shù)組,因?yàn)閙alloc有可能申請(qǐng)失敗,所以我們用if去進(jìn)行判斷。

? top棧頂初始化為0,代表沒有數(shù)據(jù)。

void StackInit(Stack* ps)
{
?? ?ps->capacity = 5;
?? ?ps->a = (Stack*)malloc(ps->capacity * sizeof(STDataType));
?? ?if (ps->a == NULL)
?? ?{
?? ??? ?perror("malloc");
?? ??? ?exit(-1);
?? ?}
?? ?ps->top = 0;
}

? 2.入棧

入棧,棧里面插入數(shù)據(jù),相當(dāng)于數(shù)組進(jìn)行尾插

首先,進(jìn)行判斷,top棧頂?shù)扔赾apacity容量的時(shí)候,代表我們棧里的內(nèi)存滿了,這里我們需要擴(kuò)容,用realloc對(duì)數(shù)組進(jìn)行擴(kuò)容,現(xiàn)在我進(jìn)行的二倍擴(kuò)容

判斷完成后 進(jìn)行插入數(shù)據(jù),在數(shù)組棧頂插入傳入的數(shù)據(jù) data

void StackPush(Stack* ps, STDataType data)
{
	//擴(kuò)容
	if (ps->top == ps->capacity)
	{
		Stack * da = (Stack*)realloc(  ps->a  ,ps->capacity * 2 * sizeof(STDataType));
		if (da == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		else
		{
			ps->a = da;
		}
		ps->capacity *= 2;
	}

	ps->a[ps->top] = data;
	ps->top++;
}

?3.出棧

出棧,直接棧頂元素減一就好了,以后插入的數(shù)據(jù)會(huì)直接替換原先的數(shù)據(jù),而top--后自己也訪問不到top以后的數(shù)據(jù)
void StackPop(Stack* ps)
{
	ps->top--;
}

4.獲取棧頂元素

獲取棧頂元素,因?yàn)閿?shù)組下標(biāo)是從0開始的,所以返回的是棧頂元素-1;

STDataType StackTop(Stack* ps)
{
	return ps->a[ps->top-1];
}

5.獲取棧中有效數(shù)據(jù)個(gè)數(shù)

有效的數(shù)據(jù)個(gè)數(shù)就是 棧頂,直接返回棧頂就好了

int StackSize(Stack* ps)
{
	return ps->top;
}

6.檢查棧是否為空

c語言并不支持bool,需要我們引用頭文件#include<stdbool.h>

判斷棧頂是否為0,來判斷棧里是否有數(shù)據(jù)

有返回true

無返回false

bool StackEmpty(Stack* ps)
{
	if (ps->top == 0)
		return true;
	else
		return false;
}

7.棧的銷毀

棧的銷毀,對(duì)容量和棧頂進(jìn)行請(qǐng)0,然后用free函數(shù)釋放我們使用malloc/realloc在堆上開辟的空間

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

以上就是c語言版本的棧的模擬實(shí)現(xiàn)

三.C++ 版本模擬實(shí)現(xiàn)棧

考慮到學(xué)校有好多老師上課,雖然說得是用c語言實(shí)現(xiàn),卻用cpp進(jìn)行操作,現(xiàn)在給大家更新cpp版本的棧的模擬實(shí)現(xiàn),cpp版本的擴(kuò)容使用的new,函數(shù)參數(shù)使用的&,可能有同學(xué)對(duì)指針使用不太熟悉,所以我們同意用&(引用)來實(shí)現(xiàn),方便大家的理解,就不再詳細(xì)的進(jìn)行說明了,思路跟c語言實(shí)現(xiàn)的一樣,只是c和cpp的語言差距有所不同。文章來源地址http://www.zghlxwxcb.cn/news/detail-719289.html

?1.C++版本的源代碼

#include<iostream>
using namespace std;

// 支持動(dòng)態(tài)增長的棧
typedef int STDataType;
typedef struct Stack1
{
	STDataType* a;
	int top;		// 棧頂
	int capacity;  // 容量 
}Stack;

// 初始化棧 
void StackInit(Stack& ps)
{
	ps.capacity = 5;
	ps.a = new STDataType[ps.capacity * sizeof(STDataType)];
	ps.top = 0;
}
// 入棧 
void StackPush(Stack& ps, STDataType data)
{
	//擴(kuò)容
	if (ps.top == ps.capacity)
	{
		STDataType* da = new STDataType[ps.capacity * 2 * sizeof(STDataType)];
		ps.a = da;
		ps.capacity *= 2;
	}
	ps.a[ps.top] = data;
	ps.top++;
}
// 出棧 
void StackPop(Stack& ps)
{
	ps.top--;
}
// 獲取棧頂元素 
STDataType StackTop(const Stack& ps)
{
	return ps.a[ps.top - 1];
}
// 獲取棧中有效元素個(gè)數(shù) 
int StackSize(const Stack& ps)
{
	return ps.top;
}
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
bool StackEmpty( const Stack& ps)
{
	if (ps.top == 0)
		return true;
	else
		return false;
}
// 銷毀棧 
void StackDestroy(Stack& ps)
{
	ps.capacity = 0;
	ps.top = 0;
	delete ps.a;
	ps.a = NULL;
}


int main()
{
	Stack s;
	StackInit(s);

	StackPush(s, 1);
	StackPush(s, 2);
	StackPush(s, 3);
	StackPush(s, 4);

	for (int i = 0;i < 4;i++)
	{
		cout << StackTop(s) << endl;
		StackPop(s);
	}

	printf("棧中有效元素個(gè)數(shù)為 %d \n", StackSize(s));
	if (StackEmpty(s))
	{
		printf("為空\n");
	}
	else
	{
		printf("不為空\n");
	}

	StackDestroy(s);
}

四.c語言版本的源代碼

? 4.1? 頭文件.h源碼

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

	// 支持動(dòng)態(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);
	// 獲取棧中有效元素個(gè)數(shù) 
	int StackSize(Stack* ps);
	// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
	bool StackEmpty(Stack* ps);
	// 銷毀棧 
	void StackDestroy(Stack* ps);

? 4.2?功能實(shí)現(xiàn)的.c文件

#include"Stack.h"

// 初始化棧 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->capacity = 5;
	ps->a = (Stack*)malloc(ps->capacity * sizeof(STDataType));
	if (ps->a == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	ps->top = 0;
}
// 入棧 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//擴(kuò)容
	if (ps->top == ps->capacity)
	{
		Stack * da = (Stack*)realloc(  ps->a  ,ps->capacity * 2 * sizeof(STDataType));
		if (da == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		else
		{
			ps->a = da;
		}
		ps->capacity *= 2;
	}

	ps->a[ps->top] = data;
	ps->top++;
}
// 出棧 
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}
// 獲取棧頂元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->a[ps->top-1];
}
// 獲取棧中有效元素個(gè)數(shù) 
int StackSize(Stack* ps)
{
	return ps->top;
}
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
bool StackEmpty(Stack* ps)
{
	if (ps->top == 0)
		return true;
	else
		return false;
}
// 銷毀棧 
void StackDestroy(Stack* ps)
{
	assert(ps);

	ps->capacity = 0;
	ps->top = 0;
	free(ps->a);
	ps->a = NULL;	
}

4.3測試代碼test.c文件

#include"Stack.h"

int main()
{
	Stack s;
	StackInit(&s);

	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);

	StackPop(&s);

	printf("棧頂元素為%d \n", StackTop(&s));
	printf("棧中有效元素個(gè)數(shù)為 %d \n", StackSize(&s));

	if (StackEmpty(&s))
	{
		printf("為空\n");
	}
	else
	{
		printf("不為空\n");
	}

	StackDestroy(&s);


}

到了這里,關(guān)于帶你深入理解“?!保╟語言 c++和stl Stack三個(gè)版本的模擬實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)文章

  • 【C++】STL中的容器適配器 stack queue 和 priority_queue 的模擬實(shí)現(xiàn)

    【C++】STL中的容器適配器 stack queue 和 priority_queue 的模擬實(shí)現(xiàn)

    適配器是一種設(shè)計(jì)模式 (設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)),該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 例如我們常見的充電器就是一種適配器,它將我們常用的220V交流電壓轉(zhuǎn)化為4,5V (或者其他更高的電

    2023年04月26日
    瀏覽(24)
  • 容器適配器---deque和STL ---stack queue priority_queue的模擬實(shí)現(xiàn) C++

    目錄 一、容器適配器 deque原理 deque的缺陷 deque的優(yōu)勢 二、stack的模擬實(shí)現(xiàn) ?三、queue的模擬實(shí)現(xiàn) 四、優(yōu)先級(jí)隊(duì)列的模擬實(shí)現(xiàn) 適配器是一種設(shè)計(jì)模式(設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)),該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶

    2024年02月02日
    瀏覽(24)
  • C語言之指針篇【超詳細(xì)講解,帶你層層深入理解指針】

    C語言之指針篇【超詳細(xì)講解,帶你層層深入理解指針】

    目錄 一、關(guān)于指針 二、指針類型 1、整型指針的訪問權(quán)限說明: 2、字符指針的訪問權(quán)限說明: 3、指針的類型決定向前或向后一步走了多大距離 三、野指針相關(guān)知識(shí) 1、野指針的成因 ①指針未初始化 ②指針的越界訪問 ③指針?biāo)赶虻目臻g釋放了 2、如何規(guī)避野指針 ①指針

    2024年02月02日
    瀏覽(33)
  • 【STL】stack、queue基本使用和模擬實(shí)現(xiàn)

    【STL】stack、queue基本使用和模擬實(shí)現(xiàn)

    目錄 前言 stack 接口介紹 模擬實(shí)現(xiàn) queue 接口介紹 模擬實(shí)現(xiàn) 沒有迭代器? deque介紹 stack 和 queue 本質(zhì)上是一種容器配接器,就像我們平時(shí)充電時(shí)使用的電源適配器,能夠?qū)㈦妷恨D(zhuǎn)換成設(shè)備能夠接受的程度。 其通過封裝特定容器作為其底層容器的類,通過一組特定的成員函數(shù)來

    2024年02月07日
    瀏覽(23)
  • C語言指針(適合C語言進(jìn)階者):一道題帶你深入理解數(shù)組與指針的關(guān)系

    ??個(gè)人主頁:JAMES別扣了 ??在校大學(xué)生一枚。對(duì)IT有著極其濃厚的興趣 ?系列專欄目前為C語言初階、后續(xù)會(huì)更新c語言的學(xué)習(xí)方法以及c題目分享. ??希望我的文章對(duì)大家有著不一樣的幫助,歡迎大家關(guān)注我,我也會(huì)回關(guān),大家一起交流一起互動(dòng),感謝大家的多多支持哈! ??

    2024年04月16日
    瀏覽(19)
  • 【STL】容器適配器stack和queue常見用法及模擬實(shí)現(xiàn)

    【STL】容器適配器stack和queue常見用法及模擬實(shí)現(xiàn)

    1.stack介紹及使用 1.1 stack的介紹 stack文檔介紹 stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行元素的插入與提取操作。 stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器是使用特定容器類的封裝對(duì)象作為其基礎(chǔ)容器的類,提供一

    2024年02月06日
    瀏覽(24)
  • 【C++】STL--stack&quene

    【C++】STL--stack&quene

    這一節(jié)主要學(xué)習(xí)stack、quene和priority_quene的使用以及模擬實(shí)現(xiàn),最后介紹了容器適配器。 目錄 stack的介紹和使用 stack的介紹 stack的使用 stack的模擬實(shí)現(xiàn) queue的介紹和使用 queue的介紹 queue的使用 queue的模擬實(shí)現(xiàn) priority_queue的介紹和使用 priority_queue的介紹 priority_queue的使用 priorit

    2024年04月23日
    瀏覽(18)
  • C++ STL stack & queue

    C++ STL stack & queue

    目錄 一.stack 介紹 ?二.stack 使用 三.stack 模擬實(shí)現(xiàn) 普通版本: 適配器版本: 四.queue的介紹 五. queue使用 六.queue模擬實(shí)現(xiàn) 七.deque介紹 1.容器適配器 2.deque的簡單介紹 3.deque的缺陷 4.為什么選擇deque作為stack和queue的底層默認(rèn)容器 stack------reference 1. stack是一種容器適配器,專門用在

    2024年02月12日
    瀏覽(22)
  • 【C++】STL之棧(stack)介紹

    【C++】STL之棧(stack)介紹

    棧(stack) 棧 是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除的操作。 插入(push), 彈出(pop)。其特性就是先進(jìn)后出,即先插入的元素最后才能彈出。大家可以把棧想象成一個(gè)彈夾,你只能在頂層一顆一顆裝入子彈,先裝的子彈在最底層,打出時(shí)也只能從上層一

    2023年04月13日
    瀏覽(14)
  • C++ STL--->stack和queue

    C++ STL--->stack和queue

    stack文檔 stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行 元素的插入與提取操作。 stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器即是對(duì)特定類封裝作為其底層的容器,并提供一組特定 的成員函數(shù)來訪問其元素,將特定類作為

    2024年01月16日
    瀏覽(52)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包