2.棧的結(jié)構(gòu)棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底,棧中的數(shù)據(jù)元素遵守 后進(jìn)先出LIFO(Last In First Out) 的原則
由于棧后進(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;
圖示:
將數(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)查看詳情吧