數據結構與算法 —— 棧的順序存儲結構及C實現

一、什麼是棧

棧是一種先進後出的數據結構,英文last in first out(LIFO),又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱爲棧頂,相對地,把另一端稱爲棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素。
在這裏插入圖片描述
棧可以有兩種方式實現,一種是順序存儲,一種是鏈式存儲,下面就來說一下兩種方式的實現。

二、棧的順序存儲結構

關於函數定義要用到的一些宏:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

typedef int Status;
typedef int ElemType;

首先定義構成棧的結構體:

typedef int ElemType;
typedef int Status;  //下面函數的定義會用到

typedef struct {
    ElemType *base; /* 棧底指針 */
    ElemType *top; /* 棧頂指針 */
    int stackSize; /* 當前已分配的存儲空間,以元素爲單位 */   
}SqStack;

  • 空棧與棧滿

在這裏插入圖片描述

  • 構造一個空棧
Status InitStack(SqStack *S)
{
    S -> base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if(!S -> base)
        return ERROR;
        
    S -> top = S -> base;  /* 空棧的棧頂與棧底相等 */
    S -> stackSize = STACK_INIT_SIZE;
    return OK;
}
  • 向棧中插入新的元素
Status Push(SqStack *S,ElemType elem)
{
    if(S -> top - S -> base >= S -> stackSize) /* 判斷棧是否已滿 */
    {
        ElemType *ptr = (ElemType *) realloc(S -> base,(S -> stackSize + STACK_INCREMENT) * sizeof(ElemType));
        if(!ptr)
            return ERROR;
        S -> base = ptr;
        S -> top = S -> base + S -> stackSize;
        S -> stackSize += STACK_INCREMENT;
    }
    
    *(S -> top) = elem;
    S -> top++;
    
    return OK;
}
  • 彈出棧頂元素
Status Pop(SqStack *S,ElemType *elem)
{
    if(S -> top == S -> base) /* 空棧 */
        return ERROR;
    *elem = *(S -> top - 1);
    S -> top--;

    return OK;
}
  • 從棧頂往下打印棧中的數據
void PrintSqStack(SqStack *S)
{
    ElemType *p = S -> top;
    while(p != S -> base) {
        printf("%d ",*(p-1));
        p--;
    }
    printf("\n");
}

  • 獲取棧的長度
int GetSqStacklength(SqStack *S)
{
    if(!S -> base)
        return ERROR;
    return S -> top - S -> base
}
  • 判斷棧是否爲空
Status CheckEmpty(SqStack *S)
{
    if(!S -> base)
        return ERROR;
    if(S -> base == S -> top)
        return TRUE;
    else
        return FALSE;
}
  • 銷燬棧
Status DestoryStack(SqStack *S)
{
    if(!S ->base)
        return ERROR;
    free(S -> base);
    S -> base = NULL;
    S -> top = NULL;
    S -> stackSize = 0;
    
    return OK;
}
  • 置空棧
Status CheckEmpty(SqStack *S)
{
    if(!S->base)
        return ERROR;
    if( S->top ==  S->base)
        return TRUE;
    else 
        return FALSE;
}

在搞清楚棧的存儲結構後,相關操作其實很好寫出來;

下面是實現的程序:

頭文件:

#ifndef  _SQSTACK_H_
#define  _SQSTACK_H_

#include <stdio.h>
#include <stdlib.h>


#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

typedef int Status;
typedef int ElemType;


typedef int ElemType;
typedef int Status;  //下面函數的定義會用到

typedef struct {
    ElemType *base; /* 棧底指針 */
    ElemType *top; /* 棧頂指針 */
    int stackSize; /* 當前已分配的存儲空間,以元素爲單位 */
}SqStack;

Status InitStack(SqStack *S);
Status Push(SqStack *S,ElemType elem);
Status Pop(SqStack *S,ElemType *elem);
void PrintSqStack(SqStack *S);
int GetSqStacklength(SqStack *S);
Status CheckEmpty(SqStack *S);
int DestoryStack(SqStack *S);
Status ClearStack(SqStack *S);
#endif   /* ----- #ifndef _SQSTACK_H_  ----- */

主程序:

#include "SqStack.h"

int main(int argc, char *argv[])
{
    SqStack S;
    SqStack *ps = &S;
    int elem = 0;
    int i;
    InitStack(ps);   /* 初始化棧 */

    for(i = 1; i <= 50; i++)   /* 賦值 */
    {
        Push(ps,i);
    }

    printf("length:%d\n",GetSqStacklength(ps));  /* 打印棧的長度 */

    Pop(ps,&elem);  /* 獲取棧頂元素 */
    printf("elem = %d\n",elem);

    PrintSqStack(ps);  /* 打印棧中所有數據 */

    ClearStack(ps);   /* 置空棧 */

    printf("length:%d\n",GetSqStacklength(ps));

    return 0;
}

打印結果:

在這裏插入圖片描述

今天就先總結到這裏啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章