学习 栈 总结

学习 栈 总结

栈只限定在表尾进行插入和删除操作的线性表.

栈的插入操作,叫做入栈. 栈的删除操作叫做出栈. 大致如下图所示:

栈

栈的抽象数据类型

Data
    同线性表,元素具有相同的类型,相邻元素有前驱和后继关系.
Operation
    InitStack(*S);
    DestroyStack(*S);
    ClearStack(*S);
    StackEmpty(*S);
    GetTop(S, *e);
    Push(*S, e);
    Pop(*S, *e);
    StackLength(S);

顺序栈

顺序栈的三种情况如下图所示:

栈

顺序栈结构定义如下:

#define MAXSIZE 20
typedef int SElemType;
// 顺序栈定义
typedef struct
{
    SElemType data[MAXSIZE];
    int top;
}SqStack;

顺序栈初始化

int InitStack(SqStack* Stack)
{
    Stack->top = -1;
    return OK;
}

进栈操作

int Push(SqStack* Stack, SElemType Element)
{
    if (Stack->top == MAXSIZE - 1)
    {
        return ERROR;
    }

    Stack->top++;
    Stack->data[Stack->top] = Element;

    return OK;
} 

出栈操作

int Pop(SqStack* Stack, SElemType* ELement)
{
    if (-1 == Stack->top)
    {
        return ERROR;
    }

    *Element = Stack->data[Stack->top];
    Stack->top--;

    return Ok;
}

获取栈顶元素

int GetTop(SqStack Stack, SElemType* Element)
{
    if (-1 == Stack->top)
    {
        return ERROR;
    }
    else
    {
        *Element = Stack.data[Stack.top];
        return OK;
    }
}

链式栈

链栈结构图如下:

链栈

链栈结构定义

typedef int SElemType;
// 链栈结点定义
typedef struct StackNode
{
    SElemType data;
    struct StackNode* next;
}StackNode, *LinkStackPtr;

typedef struct
{
    LinkStackPtr top;
    int count; // 记录栈中元素个数
}LinkStack;

链栈的初始化

int InitStack(LinkStack* Stack)
{
    Stack->top = (LinkStackPtr)malloc(sizeof(StackNode));
    if (NULL == Stack->top)
    {
        // exit;
    }

    Stack->top = NULL;
    Stack->count = 0;

    return Ok;
}

进栈操作

进栈过程如下图所示:

进栈操作

int Push(LinkStack* Stack, SElemType Element)
{
    LinkStackPtr CurrentNode = (LinkStackPtr)malloc(sizeof(StackNOde));
    if(NULL == CurrentNode)
    {
        // exit;
    }

    CurrentNode->data = Element;
    CurrentNode->next = Stack->top;
    Stack->top = CurrentNode;

    Stack->count++;

    return OK;
}

链栈判空

int StackEmpty(LinkStack Stack)
{
    if (0 == Stack.count)
        return TRUE;
    else
        return FALSE;
}

链栈置空

int ClearStack(LinkStack* Stack)
{
    LinkStackPtr NewNode, OldNode;
    NewNode = Stack->top;

    while(NewNode)
    {
        OldNode = NewNode;
        NewNode = NewNode->next;
        free(OldNode);
    }

    Stack->count = 0;
    return Ok;
}

出栈操作

出栈操作过程如下:

出栈操作

int Pop(LinkStack* Stack, SElemType* Element)
{
    LinkStackPtr CurrentNode;

    if (StackEmpty(*Stack))
        return ERROR;

    *Element = Stack->top->data;
    CurrentNode = Stack->top;
    Stack->top = Stack->top->next;

    free(CurrentNode);
    Stack->count--;
    return Ok;
}   

参考文档

http://www.nowamagic.net/librarys/veda/detail/2293

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值