数据结构与算法 —— 栈的顺序存储结构及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;
}

打印结果:

在这里插入图片描述

今天就先总结到这里啦!

猜你喜欢

转载自blog.csdn.net/weixin_45121946/article/details/106501791