數據結構中順序棧的 初始化,棧空,棧滿,入棧,出棧,遍歷函數原始碼

2020-08-11 20:51:36

順序棧的函數原始碼

#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");

}