2.棧的結構棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底,棧中的數據元素遵守 后進先出LIFO(Last In First Out) 的原則
由于棧后進先出的特點,相對而言數組的結構實現更優一些。因為數組在尾上插入數據的代價比小。實現類似于順序表,結構包括一個數組指針,指向存儲數據的數組,再就是一個指向棧頂的指針,因為壓棧時如果棧滿了需要動態開辟空間,所以這里還需要定義一個容量
//數據類型
typedef int STDataType;
//棧信息結構
typedef struct Stack
{STDataType* a;//數組
int top;// 初始為0,表示棧頂位置下一個位置的下標
int capacity;// 容量
}ST;
圖示:
將數組指針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統計棧內元素個數棧頂的下標top代表的就是棧中數據的個數,將其返回即可
//統計棧內元素個數
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;//置零
}
棧的實現到這里就介紹結束了,期待大佬們的三連!你們的支持是我大的動力!
文章有寫的不足或是錯誤的地方,歡迎評論或私信指出,我會在第一時間改正。
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
標題名稱:棧(C語言實現)-創新互聯
網頁路徑:http://vcdvsql.cn/article0/dsdjio.html
成都網站建設公司_創新互聯,為您提供網站建設、外貿建站、虛擬主機、域名注冊、小程序開發、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯