zoukankan      html  css  js  c++  java
  • 数据结构导论(第三章栈)

    一、栈

    栈和队列可看作是特 殊的线性表,它们是 运算受限的线性表

    定义:栈是只能在表的一端(表尾)进行 插入和删除的线性表

    • 允许插入及删除的一端(表尾)称为栈顶(Top); .
    • 另一端(表头)称为栈底(Bottom)。 .
    • 当表中没有元素时称为空栈
    • 进栈——在栈顶插入一元素;
    • 出栈——在栈顶删除一元素

    特点:后进先出

      栈中元素按a1,a2,a3,…an的次序进栈,出栈的第一个元素应 为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。 因此,栈称为后进先出线性表(LIFO)。

    栈的用途:常用于暂时保存有待处理的数据

    栈的基本操作

    • (1)初始化栈:InitStack(S);
    • (2)判栈空:EmptyStack (S);
    • (3)进栈:Push (S,x);
    • (4)出栈:Pop (S);
    • (5)取栈顶: GetTop(S);

    栈的分类:按照顺序结构存储是顺序栈、按照链式结果存储是链栈

    二、顺序栈

    顺序栈—— 即栈的顺序实现;

    栈容量——栈中可存放的最大元素个数;

    栈顶指针 top——指示当前栈顶元素在栈中的位置;

    栈空——栈中无元素时,表示栈空;

    栈满——数组空间已被占满时,称栈满;

    下溢——当栈空时,再要求作出栈运算,则称“下溢”;

    上溢——当栈满时,再要求作进栈运算,则称“上溢”。

    1、顺序栈的类型定义

    const int maxsize=6;
    typedef struct seqstack {
      DataType data[maxsize];
      int top;
    }SeqStk;

    SeqStk *s ; 定义一顺序栈s
    约定栈的第1个元素存在data[1]中,则
    s->top==0 代表顺序栈s为空;
    s->top==maxsize-1 代表顺序栈s为满

    2、初始化:

    int Initstack(SeqStk *stk){
        stk->top=0;
        return 1;
    }

    3、判栈空(栈空时返回值为1,否则返回值为0)

    int EmptyStack(SeqStk *stk){
        if(stk->top= =0) return 1;
        else return 0;
    }

    4、进栈

    int Push(SeqStk *stk, DataType x){
        /*数据元素x进顺序栈sq*/
        if(stk->top==maxsize -1) /*判是否上溢*/
        { error(“栈满”);return 0;} /*上溢*/
        else {
            stk->top++;/*修改栈顶指针,指向新栈顶*/
            stk->data[stk->top]=x; /*元素x插入新栈顶中*/
            return 1;
        }
        }
    }

     5、出栈

    int Pop(SeqStk *stk){
        /*顺序栈sq的栈顶元素退栈*/
        if(stk->top==0) /*判是否下溢*/
        { error(“栈空”);return 0;} /*下溢*/
        else {
        stk->top-- ; /*修改栈顶指针,指向新栈顶*/
        return 1;
        }
    }/*Pop*/

    6、取栈顶元素

    DataType GetTop(SeqStk *stk)
    {
    if(EmptyStack(stk))
    return NULLData;
    else
    return stk->data[stk->top];
    }

    三、链栈

    链栈的定义: 栈的链式存储结构称为链栈,它是运算受限的单链表, 插入和删除操作仅限制在表头位置上进行。栈顶指针就是链 表的头指针

     

    1、初始化

    void InitStack(LkStk *LS)
    {
      LS=(LkStk *)malloc(sizeof(LkStk));
      LS->next=NULL;
    }

    2、判栈空

    int EmptyStack(LkStk *LS)
    {
        if(LS->next= =NULL) return 1;
        else return 0;
    }

    3、进栈——在栈顶插入一元素x

    void Push (LkStk *LS, DataType x){ 
        LkStk *temp;
        temp= (LkStk *) malloc (sizeof (LkStk));
        temp->data=x;
        temp->next=LS->next;
        LS->next=temp;
    }

    4、出栈——在栈顶删除一元素,并返回

    int Pop (LkStk *LS)
    {
        LkStk *temp;
        if (!EmptyStack (LS))
        {
            temp=LS->next;
            LS->next=temp->next;
            free(temp);
            return 1;
        }
        else return 0;
    }

    5、取栈顶元素

    DataType GetTop(LkStk *LS)
    {
        if (!EmptyStack(LS))
        return LS->next->data;
        else
        return NULLData;
    }
  • 相关阅读:
    【转】二叉树中两个节点的最近的公共父节点
    查找最小的k个元素
    字符串的排列
    php字符串操作
    Android手机app启动的时候第一个Activity必须是MainActivity吗
    ASP.NET网站前端页面的复制
    MySQL字段类型说明
    转:Zend Server Community Edition(CE) 安装手记
    数据库远程导入导出步骤
    转:两种转换mysql数据编码的方法latin1转utf8
  • 原文地址:https://www.cnblogs.com/jalja/p/11779283.html
Copyright © 2011-2022 走看看