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

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

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

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

2.棧的結構

由于棧后進先出的特點,相對而言數組的結構實現(xiàn)更優(yōu)一些。因為數組在尾上插入數據的代價比小。實現(xiàn)類似于順序表,結構包括一個數組指針,指向存儲數據的數組,再就是一個指向棧頂的指針,因為壓棧時如果棧滿了需要動態(tài)開辟空間,所以這里還需要定義一個容量

//數據類型
typedef int STDataType;

//棧信息結構
typedef struct Stack
{STDataType* a;//數組
	int top;// 初始為0,表示棧頂位置下一個位置的下標
	int capacity;// 容量
}ST;

圖示:

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

將數組指針a置空,同時開辟出起始空間容量,并將棧頂初始化為0,這里棧頂也可以初始化為-1,如果初始化為0,取棧頂就是取下標為top-1位置處的元素,如果初始化為-1,取棧頂就是取的下標為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判斷棧是否為空

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

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

首先要考慮擴容問題,避免空間不夠還要壓棧,這里斷言ps是為了防止人為不小心傳空,然后將數據放入下標為top的位置,再將top++后移一個位置即可,此時棧頂的下標top代表的就是棧中數據的個數

//壓棧(入棧)
void StackPush(ST* ps, STDatatype x)
{assert(ps);
	// 判斷擴容
	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位置放入數據,再將top++后移
	ps->a[ps->top] = x;
	ps->top++;
}
3.4出棧

首先斷言棧為空的情況,棧空不能出棧,然后出棧操作只需要將top指針減一改變棧頂位置為原棧頂的下一個元素即可,這里不需要將原棧頂置零,后面再進行壓棧操作時自然會將其覆蓋掉

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

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

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

棧頂的下標top代表的就是棧中數據的個數,將其返回即可

//統(tǒng)計棧內元素個數
int StackSize(ST* ps)
{assert(ps);
	//返回棧頂下標
	return ps->top;
}
3.7銷毀棧

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

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

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

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

標題名稱:棧(C語言實現(xiàn))-創(chuàng)新互聯(lián)
網頁路徑:http://bm7419.com/article0/dsdjio.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站建設外貿建站、虛擬主機、域名注冊、小程序開發(fā)品牌網站制作

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網站建設