数据结构与算法分析-栈

栈ADT

栈模型

栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有 P u s h Push Push(进栈)和 P o p Pop Pop(出栈),前者相当于插入,后者则是删除最后 插入的元素。最后插入的元素可以通过使用 T o p Top Top例程在执行 P o p Pop Pop之前进行考查。对空栈进行的 P o p Pop Pop T o p Top Top一般被认为是栈的ADT的错误。另一方面,当运行 P u s h Push Push时空间用尽是一个实现错误,但不是ADT错误。

栈有时叫做LIFO(后进先出) 表。一般的模型是,存在某个元素位于栈顶,而该元素是唯一的可见元素。

栈的实现

栈的链表实现

首先,给出一些定义。实现栈要用到一个表头。

#ifndef _Stack_h
#define _Stack_h

typedef int ElementType;
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty( Stack S );
Stack CreateStack( void );
void DisposeStack( Stack S );
void MakeEmpty( Stack S );
void Push( ElementType X, Stack S );
ElementType Top( Stack S );
void Pop( Stack S );

#endif  /* _Stack_h */

/* Place in implementation file */
/* Stack implementation is a linked list with a header */
struct Node
{
   
    ELementType X;
    PrtToNode Next;
};

下面给出测试空栈的代码,测试空栈与测试空表的方式相同。

int IsEmpty(Stack S)
{
   
    return S->Next == NULL;
}

创建一个空栈,我们只要建立一个头结点; M a k e E m p t y MakeEmpty MakeEmpty设置 N e x t Next Next指针指向 N U L L NULL NULL

Stack CreateStack(void)
{
   
    Stack S;
    S = malloc(sizeof(struct Node));
    if(S == NULL)
        FatalError("Out of space!!!");
    S->Stack = NULL;
    MakeEmpty(S);
    return S;
}
void MakeEmpty(Stack S)
{
   
    if(S == NULL)
        Error("Must use CreateStack first");
    else
        while(!IsEmpty(S))
            Pop(S);
}

P u s h Push Push是作为向链表前端进行插入而实现的,其中,表的前端作为栈顶。

void Push(ElementType X, Stack S)
{
   
    PtrToNode TmpCell;
    TmpCell = (PtrToNode)malloc(sizeof(struct Node));
    if(TmpCell == NULL)
        FatalError("Out of space!!!");
    else
    {
   
        TmpCell->Element = X;
        TmpCell->Next = S->Next;
        S->Next = TmpCell;
    }
}

T o p Top To

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值