真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

棧(C語言實(shí)現(xiàn))-創(chuàng)新互聯(lián)

文章目錄:
  • 1.棧的概念
  • 2.棧的結(jié)構(gòu)
  • 3.接口實(shí)現(xiàn)
    • 3.1初始化棧
    • 3.2判斷棧是否為空
    • 3.3壓棧(入棧)
    • 3.4出棧
    • 3.5查看棧頂元素
    • 3.6統(tǒng)計(jì)棧內(nèi)元素個(gè)數(shù)
    • 3.7銷毀棧

成都創(chuàng)新互聯(lián)公司專注于左權(quán)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供左權(quán)營銷型網(wǎng)站建設(shè),左權(quán)網(wǎng)站制作、左權(quán)網(wǎng)頁設(shè)計(jì)、左權(quán)網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造左權(quán)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供左權(quán)網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。1.棧的概念

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

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

由于棧后進(jìn)先出的特點(diǎn),相對(duì)而言數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些。因?yàn)閿?shù)組在尾上插入數(shù)據(jù)的代價(jià)比小。實(shí)現(xiàn)類似于順序表,結(jié)構(gòu)包括一個(gè)數(shù)組指針,指向存儲(chǔ)數(shù)據(jù)的數(shù)組,再就是一個(gè)指向棧頂?shù)闹羔槪驗(yàn)閴簵r(shí)如果棧滿了需要?jiǎng)討B(tài)開辟空間,所以這里還需要定義一個(gè)容量

//數(shù)據(jù)類型
typedef int STDataType;

//棧信息結(jié)構(gòu)
typedef struct Stack
{STDataType* a;//數(shù)組
	int top;// 初始為0,表示棧頂位置下一個(gè)位置的下標(biāo)
	int capacity;// 容量
}ST;

圖示:

3.接口實(shí)現(xiàn) 3.1初始化棧

將數(shù)組指針a置空,同時(shí)開辟出起始空間容量,并將棧頂初始化為0,這里棧頂也可以初始化為-1,如果初始化為0,取棧頂就是取下標(biāo)為top-1位置處的元素,如果初始化為-1,取棧頂就是取的下標(biāo)為top位置處的元素

//初始化棧
void StackInit(ST* ps)
{assert(ps);
	//開辟起始空間
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)//判斷開辟成功
	{perror("malloc fail");
		exit(-1);
	}

	ps->top = 0;
	ps->capacity = 4;//初始容量
}
3.2判斷棧是否為空

根據(jù)前面的初始化,如果top指針在下標(biāo)為0的位置棧就為空,返回其布爾值即可

//判斷棧是否為空
bool StackEmpty(ST* ps)
{assert(ps);
	//返回top指針是否在下標(biāo)為0的位置
	return ps->top == 0;
}
3.3壓棧(入棧)

首先要考慮擴(kuò)容問題,避免空間不夠還要壓棧,這里斷言ps是為了防止人為不小心傳空,然后將數(shù)據(jù)放入下標(biāo)為top的位置,再將top++后移一個(gè)位置即可,此時(shí)棧頂?shù)南聵?biāo)top代表的就是棧中數(shù)據(jù)的個(gè)數(shù)

//壓棧(入棧)
void StackPush(ST* ps, STDatatype x)
{assert(ps);
	// 判斷擴(kuò)容
	if (ps->top == ps->capacity)
	{STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
		if (tmp == NULL)//判斷開辟成功
		{	perror("realloc fail");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity *= 2;
	}
	//先將top位置放入數(shù)據(jù),再將top++后移
	ps->a[ps->top] = x;
	ps->top++;
}
3.4出棧

首先斷言棧為空的情況,??詹荒艹鰲?,然后出棧操作只需要將top指針減一改變棧頂位置為原棧頂?shù)南乱粋€(gè)元素即可,這里不需要將原棧頂置零,后面再進(jìn)行壓棧操作時(shí)自然會(huì)將其覆蓋掉

//出棧
void StackPop(ST* ps)
{assert(ps);
	//斷言棧為空
	assert(!StackEmpty(ps));
	//棧頂下標(biāo)后移一位
	ps->top--;
}
3.5查看棧頂元素

首先斷言棧為空的情況,棧為空無棧頂元素,然后將下標(biāo)為top-1的棧頂元素返回即可

//查看棧頂元素
STDatatype StackTop(ST* ps)
{assert(ps);
	//斷言棧為空
	assert(!StackEmpty(ps));
	//返回棧頂元素
	return ps->a[ps->top - 1];
}
3.6統(tǒng)計(jì)棧內(nèi)元素個(gè)數(shù)

棧頂?shù)南聵?biāo)top代表的就是棧中數(shù)據(jù)的個(gè)數(shù),將其返回即可

//統(tǒng)計(jì)棧內(nèi)元素個(gè)數(shù)
int StackSize(ST* ps)
{assert(ps);
	//返回棧頂下標(biāo)
	return ps->top;
}
3.7銷毀棧

銷毀棧我們直接釋放掉存儲(chǔ)棧的數(shù)組,再將數(shù)組指針置空(避免野指針),最后將棧頂指針和容量置零即可

//銷毀棧
void StackDestroy(ST* ps)
{assert(ps);
	//釋放數(shù)組
	free(ps->a);
	ps->a = NULL;//置空
	ps->top = ps->capacity = 0;//置零
}

棧的實(shí)現(xiàn)到這里就介紹結(jié)束了,期待大佬們的三連!你們的支持是我大的動(dòng)力!
文章有寫的不足或是錯(cuò)誤的地方,歡迎評(píng)論或私信指出,我會(huì)在第一時(shí)間改正。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


標(biāo)題名稱:棧(C語言實(shí)現(xiàn))-創(chuàng)新互聯(lián)
本文來源:http://weahome.cn/article/dsdjio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部