順序棧的函數原始碼
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
/*
功能:順序棧函數的使用
棧的數據只能夠通過棧頂去操作
順序棧是通過建立一個管理結構體的方式,去管理一個數組
管理結構體中包含:指向陣列首地址的指針*stack_arr, 陣列的大小size, 棧頂相對於棧底的偏移量top(起始爲-1,滿爲size-1)
在順序棧中:我們主要討論順序棧的 初始化,棧空,棧滿,入棧,出棧,遍歷
*/
typedef int DATATYPE;
typedef struct BOSS //建立順序棧的管理結構體
{
DATATYPE *staff_arr; //定義一個指向陣列首地址的指針
DATATYPE size; //定義陣列的最大長度
DATATYPE top; //定義棧頂相對於棧底的偏移量(起始爲-1,滿爲size-1)
}Boss, *Boss_p; //爲管理結構體建立一個別名,和指針型別別名
Boss_p init(DATATYPE size); // 1.初始化管理結構體
bool is_empty(Boss_p s); // 2.棧空判斷
bool is_full(Boss_p s); // 3.棧滿判斷
bool push(Boss_p s, DATATYPE n); // 4.順序棧入棧
bool pop(Boss_p s, DATATYPE *n); // 5.順序棧出棧
void display(Boss_p s); // 6.順序棧的遍歷
int main(int argc, char const *argv[])
{
/*int n,temp;
Boss_p boss = init(10); //初始化棧的大小爲10個整型空間
for (int i = 0; i < 10; ++i)
{
push(boss, i+1); //初始化數據爲1-10
}
display(boss);
printf("按1出棧\n");
scanf("%d",&n);
if (n == 1)
{
pop(boss, &temp); //向出棧的函數中傳入變數的地址,用於獲取出棧元素
printf("出棧元素爲:%d\n", n);
}
display(boss);*/
printf("Cai_grass的部落格--所有程式碼已驗證,可直接執行\n");
return 0;
}
// 1.初始化管理結構體
Boss_p init(DATATYPE size)
{
Boss_p s = malloc(sizeof(Boss)); //爲管理結構體申請空間
if (s != NULL)
{ //管理結構體空間申請成功後,再爲陣列申請空間
s->staff_arr = calloc(size, sizeof(DATATYPE));
s->size = size; //size 表示陣列的最大容納量
s->top = -1; //偏移量爲-1,表示指向棧底
return s;
}
return NULL;
}
// 2.棧空判斷
bool is_empty(Boss_p s)
{
return (s->top == -1);
}
// 3.棧滿判斷
bool is_full(Boss_p s)
{
return (s->top == s->size-1);
}
// 4.順序棧入棧
bool push(Boss_p s, DATATYPE n)
{
if (is_full(s)) //如果棧已經滿了,入棧失敗
{
return false;
}
s->top++; //棧沒滿的話,就棧頂往後移,爲新的元素讓出空間
s->staff_arr[s->top] = n; //用陣列的方式去賦值
return true;
}
// 5.順序棧出棧
bool pop(Boss_p s, DATATYPE *n) //n是用來獲取出棧元素的
{
if (is_empty(s)) //如果棧空,出棧失敗
{
return false;
}
*n = s->staff_arr[s->top]; //用傳入的形參獲取到出棧元素,也可以不用,直接列印
s->top--; //元素減少一個,棧頂指針偏移減一
}
// 6.順序棧的遍歷
void display(Boss_p s) //因爲順序棧管理的是陣列,通過陣列的方式去遍歷即可
{
for (int i = 0; i < s->top+1; ++i) //棧頂指針的偏移量+1,就是元素的個數
{
printf("%d\t", s->staff_arr[i]);
}
printf("\n");
}