栈的原理及实现

栈的原理及实现

栈是一个先入后出(First In Last Out,)的线性表。元素的插入和删除只能在线性表的同一端进行。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。

运用的场合有:

浏览器网页的访问记录。

文本编辑器中的撤销功能。

充当其他数据结构和算法实现的一个组件。

栈的实现

两种很常见的实现方式:

  • 数组实现

  • 链表实现

#include"stack.h"
#include"..\fatal.h"
#include<stdlib.h>
#include<stdio.h>

#define EmptyTOS (-1)
#define MinStackSize (5)

typedef int ElementType;

struct StackRecord;
typedef struct StackRecord *Stack;

struct StackRecord{
    int Capacity; //容量,即数组的最大长度
    int TopOfStack; //栈顶
    ElementType *Array;	//实际存储元素的数组
};

int IsEmpty(Stack S){
    return S->TopOfStack == EmptyTOS;
};

int IsFull(Stack S){
    return S->TopOfStack == S->Capacity - 1;
}

Stack CreateStack(int MaxElements){
    Stack S;

    if(MaxElements < MinStackSize)
        Error("Stack Size is too small.");

    S = malloc(sizeof(struct StackRecord));
    if(S == NULL)
        FatalError("Out of Space!!");

    S->Array = malloc(sizeof(ElementType) * MaxElements);
    if(S->Array == NULL)
        FatalError("Out of space!!");

    S->Capacity = MaxElements;
    MakeEmpty(S);

    return S;
}

void MakeEmpty(Stack S){
    S->TopOfStack = EmptyTOS;
}

void DisposeStack(Stack S){
    if(S != NULL){
        free(S->Array);
        free(S);
    }
}

void Push(Stack S, ElementType X){
    if(IsFull(S))
        Error("Full Stack");
    else
        S->Array[++S->TopOfStack] = X;
}

void Pop(Stack S){
    if(IsEmpty(S))
        Error("Empty Stack");
    else
        S->TopOfStack--;
}

ElementType Top(Stack S){
    if(IsEmpty(S))
        Error("Empty Stack");
    else
        return S->Array[S->TopOfStack];
}
ElementType TopAndPop( Stack S )
{
    if( !IsEmpty( S ) )
        return S->Array[ S->TopOfStack-- ];
    Error( "Empty stack" );
    return 0;  /* Return value used to avoid warning */
}

下次补上栈的链表实现。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值