順序棧————遍歷、出棧、入棧

Dazz_24發表於2024-04-25

以陣列作為基礎實現棧空間(順序棧)

陣列在記憶體中佔用一塊連續的空間,也就是陣列元素的記憶體地址是連續的。為了實現棧,一般是把陣列頭作為棧底,陣列頭部到陣列尾部作為棧的增長方向,也就是使用者只在陣列尾部對資料進行插入和刪除。

  • 為了方便管理順序棧所以需要構造管理順序棧資訊的結構體型別,用於記錄重要引數,如下:
    Bottom:記錄棧底地址
    Size :記錄棧容量
    Top :記錄棧頂元素下標 (為-1則棧空)

image

以下是我的程式碼:

/*******************************************************************
 *
 *	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;
}

相關文章