zoukankan      html  css  js  c++  java
  • 数据结构之栈(三)

    一、栈的定义

      栈是一种特殊的线性表,允许在同一端进行插入和删除操作,遵循“先进后出”的原则。

      栈的基本操作:入栈(Push)、出栈(Pop)。

    二、栈的分类

      栈可以分为:顺序栈和链栈。

      (1)顺序栈

      顺序栈是栈的顺序存储结构的简称,它是一个运算受限的顺序表。

      使用C语言定义顺序栈类型的格式。

    #define StackSize 100    //预分配的栈空间最多为100个元素
    typedef char DataType;   //栈元素的数据类型为字符
    typedef struct  
    {
        DataType data[StackSize];
        int top;
    }SeqStack;

      初始化栈,将栈置空

    void InitStack(SeqStack *S)
    {
        //将顺序栈置空
        S->top = -1;
    }

      判断栈是否为空

    int StackEmpty(SeqStack *S)
    {
        return S->top == -1;
    }

      判断栈是否为满

    void StackFull(SeqStack *S)
    {
        return S->top == StackSize - 1;
    }

      压栈

    void Push(S, x)
    {
        if (StackFull(S))
        {
            Error("Stack overflow");//上溢,退出运行
        }
        S->data[++S->top] = x;//栈顶指针加1后将x入栈
    }

      出栈

    DataType Pop(S)
    {
        if (StackEmpty(S))
        {
            Error("Stack underflow");//下溢,退出运行
        }
        return S->data[S->top--];//栈顶元素返回后将指针减1
    }

      取栈顶元素

    DataType StackTop(S)
    {
        if (StackEmpty(S))
        {
            Error("Stack is empty!");
        }
        return S->data[S->top];
    }

      (2)链栈

      C语言定义链栈类型的代码如下:

    typedef struct stacknode
    {
        DataType data;
        struct stacknode *next;
    }StackNode;
    typedef struct 
    {
        StackNode *top;   //栈顶指针
    }LinkStack;

      将栈置空 

    void InitStack(LinkStack *S)
    {
        S->top = NULL;
    }

      判断栈是否为空

    int StackEmpty(LinkStack *S)
    {
        return S->top == NULL;
    }

      进栈

    void Push(LinkStack *S, DataType x)
    {
        //将元素x插入栈链头部
        StackNode *p = (StackNode *)malloc(sizeof(StackNode));
        p->data = x;
        p->next = S->top;//将新节点*p插入链栈头部
        S->top = p;
    }

      退栈

    DataType Pop(LinkStack *S)
    {
        DataType x;
        StackNode *p = S->top; //保存栈顶指针
        if (StackEmpty(S))
        {
            Error("Stack underflow.");//下溢
        }
        x = p->data; //保存栈顶节点数据
        S->top = p->next; //将栈顶节点从链上摘下
        free(p);
        return x;
    }

      获取栈顶元素

    DataType StackTop(LinkStack *S)
    {
        if (StackEmpty(S))
        {
            Error("Stack is empty!");
        }
        return S->top->data;
    }
  • 相关阅读:
    同余关系 等价关系 同余关系的原型
    同态 同构
    In abstract algebra, a congruence relation (or simply congruence) is an equivalence relation on an algebraic structure (such as a group, ring, or vector space) that is compatible with the structure in
    数学用语中的 透明 transitive property
    Sethi model
    非奇异的;非退化的;满秩
    非齐次线性方程组 引出线性流形 陪集
    field, or, more generally, in a ring or even a semiring 数域、环、半环
    Linear transformations. 线性变换与矩阵的关系
    Isomorphism 同构
  • 原文地址:https://www.cnblogs.com/hxf175336/p/9867347.html
Copyright © 2011-2022 走看看