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

【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解

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

?【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解

  • ?? 博客內(nèi)容:順序棧的原理詳解

  • ?? 作??者:陳大大陳

  • ?? 個(gè)人簡(jiǎn)介:一個(gè)正在努力學(xué)技術(shù)的準(zhǔn)前段,專注基礎(chǔ)和實(shí)戰(zhàn)分享 ,歡迎私信!

  • ?? 歡迎大家:這里是CSDN,我總結(jié)知識(shí)和寫筆記的地方,喜歡的話請(qǐng)三連,有問題請(qǐng)私信 ?? ?? ??

目錄

順序棧的定義

結(jié)構(gòu)體定義

順序棧的初始化?

判斷順序棧是否為空

求順序棧的長(zhǎng)度

清空順序棧

銷毀順序棧

順序棧的入棧

順序棧的出棧

求棧頂元素

順序棧的遍歷

菜單的打印?

順序棧的代碼實(shí)現(xiàn)

順序棧的定義

棧(stack),是僅限在表尾進(jìn)行插入或者刪除操作的線性表,因此,對(duì)棧來說,表尾端有其特殊含義,稱為棧頂,表頭端則稱為棧底,不含元素的空表稱為空棧。棧的修改是按照后進(jìn)先出的原則進(jìn)行的,因此,棧也被稱為后進(jìn)先出的線性表。

結(jié)構(gòu)體定義

我們定義一個(gè)棧頂指針top和一個(gè)棧底指針base,棧頂指針和棧頂指針一開始指向同一片空間。

所以top==base可以作為??盏臉?biāo)記。

當(dāng)插入一個(gè)新數(shù)據(jù)時(shí),棧頂指針加一,刪除一個(gè)元素時(shí),棧頂指針減一。

所以當(dāng)順序棧非空時(shí),棧頂指針永遠(yuǎn)在棧頂元素的下一位。

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#define maxsize 100
#define inc 10
typedef struct Sqstack
{
	int* base;//棧頂指針
	int* top;//棧底指針
	int stacksize;//棧的容量
}stack;

順序棧的初始化?

上面也說了,順序棧一開始棧頂指針和戰(zhàn)地指針是指向一塊空間的,因此這里就讓棧頂指針和棧底指針相等。

我們使用動(dòng)態(tài)內(nèi)存開辟空間,先給棧一個(gè)默認(rèn)的空間大小。

如果不夠,后面的入棧會(huì)檢測(cè)到并開辟空間。

如果空間開辟失敗,就退出。

void InitStack(stack& s)
{
	s.base = (int*)malloc(sizeof(int) * maxsize);
	if (!s.base) exit(0);
	s.top=s.base;
	s.stacksize = maxsize;
}

判斷順序棧是否為空

這里沒什么好說的,如果棧頂指針和棧底指針指向同一片空間,那就說明它們中間沒有數(shù)據(jù),順序棧是空棧。

int isEmpty(stack s)
{
	if (s.base==s.top)
	{
		return 1;
	}
	return 0;
}

求順序棧的長(zhǎng)度

棧頂指針減去棧底指針的值即為順序棧的長(zhǎng)度。

int stacklength(stack s)
{
	return s.top - s.base;
}

清空順序棧

如果順序棧不是空棧,就讓棧頂指針等于棧底指針,這就在邏輯上清空了順序棧的元素。

如果順序表是空棧,就表明順序棧已經(jīng)清空,不需要重復(fù)操作。

void stackclean(stack& s)
{
	if (s.base)
	{
		s.top = s.base;
		printf("順序棧清空成功\n");
	}
	else
	{
		printf("順序棧已清空,無需再次重復(fù)操作\n");
	}
	
}

銷毀順序棧

我們直接用delete函數(shù)來銷毀棧底指針?biāo)赶虻目臻g,也就是順序棧。

之后不要忘記將棧頂指針和棧底指針置空,否則會(huì)造成內(nèi)存泄露的問題 。

void destorystack(stack& s)
{
	if (s.base)
	{
		delete(s.base);
		s.stacksize = 0;
		s.base = NULL;
		s.top = NULL;
		printf("銷毀成功\n");
	}
	else
	{
		printf("棧已經(jīng)被銷毀,無需銷毀\n");
	}
}

順序棧的入棧

當(dāng)順序棧里的空間不夠用的時(shí)候,就需要?jiǎng)討B(tài)的開辟空間。

使用realloc函數(shù)來開辟新的空間,并讓棧底指針指向這一片空間。

需要注意的是,棧頂指針和棧底指針在新空間的位置需要我們重新定義。

stacksize也要加上我們之前定義的增加量。

void push(stack& s,int e)
{
	if ((s.top - s.base) >= s.stacksize)
	{
		s.base = (int*)realloc(s.base, (maxsize + inc) * sizeof(int));
		if (!s.base) perror("realloc");
		s.top = s.base + s.stacksize;
		s.stacksize += inc;
	}
	else
	{
		*(s.top) = e;
		s.top++;
		printf("添加成功\n" );
	}
}

順序棧的出棧

這里用到了之前判斷順序棧是否為空的函數(shù)。

如果為空,則打印無法彈出。

不為空,先讓棧頂指針減一到棧頂?shù)谝粋€(gè)元素的位置,再將其值復(fù)制給指針變量e。成功彈出元素。

void pop(stack& s,int &e)
{
	if (isEmpty(s))
	{
		printf("棧為空,無法彈出\n");
	}
    else
	{
		if (s.top != s.base)
		{
			s.top--;
			e = *(s.top);
			printf("成功彈出\n");
		}
	}
	
}

求棧頂元素

求棧頂元素的操作看起來和出棧的操作一模一樣。

是不是有的小伙伴會(huì)擔(dān)心這里的操作會(huì)把數(shù)據(jù)彈出??

那你就忽略了一個(gè)點(diǎn),這里函數(shù)聲明里所傳的是一級(jí)指針,并沒有改變實(shí)參的能力。

也就是說,這里函數(shù)聲明里的形參只是實(shí)參的臨時(shí)拷貝而已。翻不起風(fēng)浪。

int top(stack s)
{
	if (isEmpty(s))
	{
		printf("棧為空,沒有棧頂元素\n") ;
		return -1;
	}
	else
	{
		s.top--;
		return *(s.top);
	}
}

順序棧的遍歷

這里需要用到上面求長(zhǎng)度的函數(shù),求出長(zhǎng)度遍歷并打印順序棧元素即可

void traverse(stack s)
{
	int length = stacklength(s);
	if (length > 0)
	{
		for (int i = 0; i < stacklength(s); i++)
		{
			printf("%d ", s.base[i]);
		}
	}
	else
	{
		printf("順序棧為空\(chéng)n");
	}
}

菜單的打印?

void menu()
{
	printf("**********************************\n");
	printf("1.初始化\n");
	printf("2.判斷棧是否為空\(chéng)n");
	printf("3.求棧的長(zhǎng)度\n");
	printf("4.清空棧\n");
	printf("5.銷毀棧\n");
	printf("6.入棧\n");
	printf("7.出棧\n");
	printf("8.求棧頂元素\n");
	printf("9.遍歷順序棧\n");
	printf( "10.退出\n");
	printf( "**********************************\n" );
}

順序棧的代碼實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
typedef struct Sqstack
{
	int* base;//棧頂指針
	int* top;//棧底指針
	int stacksize;//棧的容量
}stack;
#define maxsize 100
#define inc 10
void InitStack(stack& s)
{
	s.base = (int*)malloc(sizeof(int) * maxsize);
	if (!s.base) exit(0);
	s.top=s.base;
	s.stacksize = maxsize;
}
int isEmpty(stack s)
{
	if (s.base==s.top)
	{
		return 1;
	}
	return 0;
}
int stacklength(stack s)
{
	return s.top - s.base;
}
void stackclean(stack& s)
{
	if (s.base)
	{
		s.top = s.base;
		printf("順序棧清空成功\n");
	}
	else
	{
		printf("順序棧已清空,無需再次重復(fù)操作\n");
	}
	
}
void destorystack(stack& s)
{
	if (s.base)
	{
		delete(s.base);
		s.stacksize = 0;
		s.base = NULL;
		s.top = NULL;
		printf("銷毀成功\n");
	}
	else
	{
		printf("棧已經(jīng)被銷毀,無需銷毀\n");
	}
}
void push(stack& s,int e)
{
	if ((s.top - s.base) >= s.stacksize)
	{
		s.base = (int*)realloc(s.base, (maxsize + inc) * sizeof(int));
		if (!s.base) perror("realloc");
		s.top = s.base + s.stacksize;
		s.stacksize += inc;
	}
	else
	{
		*(s.top) = e;
		s.top++;
		printf("添加成功\n" );
	}
}
void pop(stack& s,int &e)
{
	if (isEmpty(s))
	{
		printf("棧為空,無法彈出\n");
	}
    else
	{
		if (s.top != s.base)
		{
			s.top--;
			e = *(s.top);
			printf("成功彈出\n");
		}
	}
	
}
void traverse(stack s)
{
	int length = stacklength(s);
	if (length > 0)
	{
		for (int i = 0; i < stacklength(s); i++)
		{
			printf("%d ", s.base[i]);
		}
	}
	else
	{
		printf("順序棧為空\(chéng)n");
	}
}

int top(stack s)
{
	if (isEmpty(s))
	{
		printf("棧為空,沒有棧頂元素\n") ;
		return -1;
	}
	else
	{
		s.top--;
		return *(s.top);
	}
}
void menu()
{
	printf("**********************************\n");
	printf("1.初始化\n");
	printf("2.判斷棧是否為空\(chéng)n");
	printf("3.求棧的長(zhǎng)度\n");
	printf("4.清空棧\n");
	printf("5.銷毀棧\n");
	printf("6.入棧\n");
	printf("7.出棧\n");
	printf("8.求棧頂元素\n");
	printf("9.遍歷順序棧\n");
	printf( "10.退出\n");
	printf( "**********************************\n" );
}
int main()
{
	int choice;
	stack s;
	int e1, e2;
	while (1)
	{
		menu();
		scanf("%d",&choice);
		switch (choice)
		{
		case 1:
			InitStack(s);
			printf( "初始化成功\n" );
			break;
		case 2:
			if (isEmpty(s))
				printf("棧為空\(chéng)n" );
			else
				printf("棧不為空\(chéng)n");
			break;
		case 3:
			printf("棧的長(zhǎng)度為%d\n", stacklength(s));
			break;
		case 4:
			stackclean(s);
			break;
		case 5:
			destorystack(s);
			break;
		case 6:
			printf("請(qǐng)輸入想要入棧的元素值:>");
			scanf("%d",&e1);
			push(s, e1);
			break;
		case 7:
			pop(s, e2);
			printf("彈出的元素為%d\n" ,e2 );
			break;
		case 8:
			if (top(s) != -1)
				printf("棧頂元素為%d\n" , top(s) );
			break;
		case 9:
			traverse(s);
			printf("\n");
			break;
		case 10:
			printf ( "成功退出\n" );
			exit(0);
		default:
			printf ("輸入有誤,請(qǐng)重新輸入\n" );
			break;
		}
	}
}

運(yùn)行實(shí)例【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解

【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解

【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解

【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解

總結(jié)
??感謝觀看,本文到這里就結(jié)束了,如果覺得有幫助,請(qǐng)給文章點(diǎn)個(gè)贊吧,讓更多的人看到。?? ?? ??

【數(shù)據(jù)結(jié)構(gòu)專欄】動(dòng)態(tài)擴(kuò)容順序棧詳解?

??也歡迎你,關(guān)注我。?? ?? ??

??原創(chuàng)不易,還希望各位大佬支持一下,你們的點(diǎn)贊、收藏和留言對(duì)我真的很重要?。。?? ?? ?? 最后,本文仍有許多不足之處,歡迎各位認(rèn)真讀完文章的小伙伴們隨時(shí)私信交流、批評(píng)指正!下期再見。??文章來源地址http://www.zghlxwxcb.cn/news/detail-406139.html

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

本文來自互聯(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)之動(dòng)態(tài)順序表(附帶完整程序)

    數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)順序表(附帶完整程序)

    ??(1)線性表: 是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。線性表在邏輯上是線性結(jié)構(gòu),但在物理上存儲(chǔ)時(shí),通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲(chǔ)。 ??(2)順序表: 順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。在數(shù)

    2024年02月14日
    瀏覽(17)
  • C語言數(shù)據(jù)結(jié)構(gòu)-----順序表(多功能動(dòng)態(tài)順序表的代碼實(shí)現(xiàn))

    C語言數(shù)據(jù)結(jié)構(gòu)-----順序表(多功能動(dòng)態(tài)順序表的代碼實(shí)現(xiàn))

    本篇講述了順序表的相關(guān)知識(shí),以及動(dòng)態(tài)順序表的代碼實(shí)現(xiàn)。 順序表和鏈表一般情況下都會(huì)叫他們線性表。 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實(shí)際中廣泛使 用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊(duì)列、字符串… 線性

    2024年02月07日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)與算法——順序表(順序存儲(chǔ)結(jié)構(gòu))及初始化詳解

    數(shù)據(jù)結(jié)構(gòu)與算法——順序表(順序存儲(chǔ)結(jié)構(gòu))及初始化詳解

    順序表 ,全名 順序存儲(chǔ)結(jié)構(gòu) ,是線性表的一種。通過《什么是線性表》一節(jié)的學(xué)習(xí)我們知道,線性表用于存儲(chǔ)邏輯關(guān)系為“一對(duì)一”的數(shù)據(jù),順序表自然也不例外。 不僅如此,順序表對(duì)數(shù)據(jù)的物理存儲(chǔ)結(jié)構(gòu)也有要求。 順序表存儲(chǔ)數(shù)據(jù)時(shí),會(huì)提前申請(qǐng)一整塊足夠大小的物理

    2024年02月16日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu):順序表詳解

    數(shù)據(jù)結(jié)構(gòu):順序表詳解

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

    2024年02月14日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】——順序表詳解

    【數(shù)據(jù)結(jié)構(gòu)】——順序表詳解

    大家好!當(dāng)我們學(xué)習(xí)了動(dòng)態(tài)內(nèi)存管理后,就可以寫一個(gè)管理數(shù)據(jù)的順序表了!??! 順序表的理解: 線性表是最基本、最簡(jiǎn)單、也是最常用的一種數(shù)據(jù)結(jié)構(gòu)。線性表(linear list)是數(shù)據(jù)結(jié)構(gòu)的一種,一個(gè)線性表是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 順序表是在計(jì)算機(jī)內(nèi)存

    2024年02月08日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序表詳解

    【數(shù)據(jù)結(jié)構(gòu)】順序表詳解

    當(dāng)我們寫完通訊錄后,順序表肯定難不倒你,跟著小張一起來學(xué)習(xí)順序表吧! 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊(duì)列、字符串… 線性表在邏輯上是線性結(jié)構(gòu),也就

    2024年02月10日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    hello,大家好,今天的內(nèi)容是關(guān)于順序表的,其實(shí)之前也發(fā)過文章,但是那個(gè)時(shí)候水平還是差了一點(diǎn),有些地方不是很詳細(xì),這次會(huì)把每個(gè)點(diǎn)都講清楚,也當(dāng)給自己在復(fù)習(xí)一遍。 順序表在本質(zhì)上就是數(shù)組,順序表是連續(xù)的,我們的數(shù)組在內(nèi)存上也是連續(xù)存儲(chǔ)的,所以我們可以

    2024年02月06日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)入門 — 順序表詳解

    數(shù)據(jù)結(jié)構(gòu)入門 — 順序表詳解

    數(shù)據(jù)結(jié)構(gòu)入門 — 順序表詳解 博客主頁鏈接:https://blog.csdn.net/m0_74014525 關(guān)注博主,后期持續(xù)更新系列文章 文章末尾有源碼 *****感謝觀看,希望對(duì)你有所幫助***** 順序表是連續(xù)存儲(chǔ)的 順序表是一種線性表的數(shù)據(jù)結(jié)構(gòu),它的數(shù)據(jù)元素按照一定次序依次存儲(chǔ)在計(jì)算機(jī)存儲(chǔ)器中,使

    2024年02月11日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)(一):順序表詳解

    數(shù)據(jù)結(jié)構(gòu)(一):順序表詳解

    在正式介紹順序表之前,我們有必要先了解一個(gè)名詞:線性表。 線性表: 線性表是,具有n個(gè)相同特性的數(shù)據(jù)元素的有限序列。常見的線性表:順序表、鏈表、棧、隊(duì)列、數(shù)組、字符串... 線性表在邏輯上是線性結(jié)構(gòu),但在物理結(jié)構(gòu)上并不一定是連續(xù)的。 1. 順序表概念 順序表

    2024年02月13日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包