以陣列作為基礎實現棧空間(順序棧)
陣列在記憶體中佔用一塊連續的空間,也就是陣列元素的記憶體地址是連續的。為了實現棧,一般是把陣列頭作為棧底,陣列頭部到陣列尾部作為棧的增長方向,也就是使用者只在陣列尾部對資料進行插入和刪除。
- 為了方便管理順序棧所以需要構造管理順序棧資訊的結構體型別,用於記錄重要引數,如下:
Bottom:記錄棧底地址
Size :記錄棧容量
Top :記錄棧頂元素下標 (為-1則棧空)
以下是我的程式碼:
/*******************************************************************
*
* file name: SequenceStack.c
* author : Dazz
* date : 2024/04/25
* function : 設計一個進位制轉換程式,使用順序棧設計一個把十進位制數轉換為
* 十六進位制數的介面,實現當透過鍵盤輸入一個非負的十進位制數,
* 可以在終端輸出對應的十六進位制數
* note : None
*
* CopyRight (c) 2024-202x Dazz_24@163.com All Right Reseverd
*
* *****************************************************************/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// 指的是順序棧中的元素的資料型別,使用者可以根據需要進行修改
typedef int DataType_t;
// 構造記錄順序棧SequenceStack各項引數(棧底地址+棧容量+棧頂元素的下標)的結構體
typedef struct SequenceStack
{
DataType_t *Bottom; // 記錄棧底地址
unsigned int Size; // 記錄棧容量
int Top; // 記錄棧頂元素的下標
} SeqStack_t;
/******************************************************
*
* name : SeqStack_Create
* function : 建立順序表並對順序棧進行初始化
* argument
* @size :順序棧的容量
*
* retval : 順序棧的地址
* author : Dazz
* date : 2024/4/25
* note : None
*
* *******************************************************/
SeqStack_t *SeqStack_Create(unsigned int size)
{
// 1.利用calloc為順序棧的管理結構體申請一塊堆記憶體
SeqStack_t *Manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t));
if (NULL == Manager)
{
perror("calloc memory for manager is failed");
exit(-1); // 程式異常終止
}
// 2.利用calloc為所有元素申請堆記憶體
Manager->Bottom = (DataType_t *)calloc(size, sizeof(DataType_t));
if (NULL == Manager->Bottom)
{
perror("calloc memory for Stack is failed");
free(Manager);
exit(-1); // 程式異常終止
}
// 3.對管理順序棧的結構體進行初始化(元素容量 + 最後元素下標)
Manager->Size = size; // 對順序棧中的容量進行初始化
Manager->Top = -1; // 由於順序棧為空,則棧頂元素的下標初值為-1
return Manager;
}
/******************************************************
*
* name : SeqStack_IsFull
* function : 判斷順序棧是否已滿
* argument
* @Manager :順序棧的地址
*
* retval : 順序棧已滿返回1,否則返回0
* author : Dazz
* date : 2024/4/25
* note : None
*
* *******************************************************/
bool SeqStack_IsFull(SeqStack_t *Manager)
{
return (Manager->Top + 1 == Manager->Size) ? true : false;
}
/******************************************************
*
* name : SeqStack_Push
* function : 入棧
* argument
* @Manager :順序棧的地址
* @Data :入棧的資料
*
* retval : 順序棧已滿返回1,否則返回0
* author : Dazz
* date : 2024/4/25
* note : None
*
* *******************************************************/
bool SeqStack_Push(SeqStack_t *Manager, DataType_t Data)
{
// 1.判斷順序棧是否已滿
if (SeqStack_IsFull(Manager))
{
printf("SeqStack Full is Full!\n");
return false;
}
// 2.如果順序棧有空閒空間,則把新元素新增到順序棧的棧頂
Manager->Bottom[++Manager->Top] = Data;
return true;
}
/******************************************************
*
* name : SeqStack_IsEmpty
* function : 判斷順序棧是否為空
* argument
* @Manager :順序棧的地址
*
* retval : 順序棧為空返回1,否則返回0
* author : Dazz
* date : 2024/4/25
* note : None
*
* *******************************************************/
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{
return (-1 == Manager->Top) ? true : false;
}
/******************************************************
*
* name : SeqStack_Pop
* function : 出棧
* argument
* @Manager :順序棧的地址
*
* retval : 出棧的資料
* author : Dazz
* date : 2024/4/25
* note : None
*
* *******************************************************/
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
DataType_t temp = 0; // 用於儲存出棧元素的值
// 1.判斷順序棧是否為空
if (SeqStack_IsEmpty(Manager))
{
printf("SeqStack is Empty!\n");
return;
}
// 2.由於刪除了一個元素,則需要讓順序棧的棧頂元素下標-1
temp = Manager->Bottom[Manager->Top--];
return temp;
}
/******************************************************
*
* name : SeqStack_Print
* function : 遍歷並列印每個資料
* argument
* @Manager :順序棧的地址
*
* retval : None
* author : Dazz
* date : 2024/4/25
* note : None
*
* *******************************************************/
void SeqStack_Print(SeqStack_t *Manager)
{
if (-1 == Manager->Top)
{
printf("棧為空\n");
return;
}
for (int i = 0; i <= Manager->Top; ++i)
{
printf(" Stack Element[%d] = %d\n", i, Manager->Bottom[i]);
}
}
int main()
{
SeqStack_t *Manager = SeqStack_Create(100);
SeqStack_Push(Manager, 999);
SeqStack_Push(Manager, 888);
SeqStack_Pop(Manager);
SeqStack_Pop(Manager);
SeqStack_Pop(Manager);
SeqStack_Print(Manager);
return 0;
}