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;
    }
  • 相关阅读:
    Github开始强制使用PAT(Personal Access Token)了
    STM32F401的外部中断EXTI
    STM32F401的PWM输出
    STM32F103和STM32F401的ADC多通道采集DMA输出
    nRF24L01无线模块笔记
    51单片机(STC89C52)在Ubuntu下的开发
    51单片机(STC89C52)的中断和定时器
    51单片机的软件和硬件PCA/PWM输出
    Zadig 云原生持续交付 面向开发者设计的开源、高可用 CI/CD
    人生 乐观 悲观 英雄
  • 原文地址:https://www.cnblogs.com/hxf175336/p/9867347.html
Copyright © 2011-2022 走看看