zoukankan      html  css  js  c++  java
  • 第二章 栈和队列(1)——顺序存储

    1、栈(Stack):是一种特殊的线性表(数据元素之间的关系是线性关系),其插入、删除只能在表的一端进行,另一端固定不动。

    2、术语:

    栈顶(top):插入、删除的一端;

    栈底(bottom):固定不动的一端;

    入栈(push):又称压入,即插入一个元素;

    出栈(pop):又称弹出,即删除一个元素;

    3、栈的操作

    1)栈初始化Inistack(s):将栈置为空;

    2)入栈Push(s):即在栈顶插入一个元素;

    3)出栈Pop(s):即在栈顶删除一个元素;

    4)取栈顶元素Get_top(s):访问栈顶元素;

    5)判断栈是否空Empty(s):判断是否为空;

    6)求栈的大小Current_size(s):求栈中元素个数;

    7)栈清空Clear(s):将栈清为空;

    4、栈的ADT描述

    ADT Stack{
        data structure:
        D={ai|ai∈D0 i=1,2,... n>=0}
        R={N}
        N={<ai-1,ai>|ai-1,ai∈D0 i=2,3,4,...}
        D0是某个对象
        operations:
        Initiate(S);Push(S);Pop(S);Get_top(S);
        Empty(S);Current_size(S);Clear(S);
    }ADT Stack

    5、存储方式:同一般线性表的顺序存储结构完全相同。但是栈底可以在地址低端,也可以在地址高端。

    栈的顺序存储结构的特点:简单,方便,但易产生溢出。

    上溢(overflow):栈已经满,又要压入元素;

    下溢(Underflow):栈已经空,还要弹出元素;

    注:上溢是一种错误,使问题的处理无法进行下去;而下溢一般认为是一种结束条件,即问题处理结束。

    6、虑拟实现:

    #define STACK_INIT_SIZE 100;
    #define STACKINCREMENT 10;
    typedef struct {
        SElemType *base; //在栈构造之前和销毁之后,base=NULL
        SElemType *top;//栈顶指针
        int stacksize;
    }SqStack;

    7、操作

    1)栈初始化

    Status InitStack(SqStack &S)
    {
        S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))
        if(!S.base)exit(OVERFLOW);
        S.top=S.base;
        S.stacksize=STACK_INIT_SIZE;
        return OK;
    }

    2)入栈    //在栈顶插入新元素,要考虑上溢的处理

    Status Push(SqStack &S, SElemType e)
    {
        if(S.top-S.base>=S.stacksize)
        {
        S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)exit(OVERFLOW)
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
        }
        *S.top++=e;
        reutrn OK;
    }

    3)出栈//若栈不空,则删除S的栈顶元素,用e返回其值

    Status Pop(SqStack &S, SElemType &e)
    {
        if(S.top==S.base) return ERROR;
        e=*--S.top;
        return OK;
    }

    4)判断栈是否空

    Status StackEmpty(SqStack S)
    {
        if(S.top=S.base)
        return TRUE;
        else return FALSE;
    }

    5)取栈顶元素

    Status GetTop(SqStack S, SElemType &e)
    {
        //若栈不空,用e返回栈顶元素
        if(S.top==S.base) return ERROR;
        e=*(S.top-1);
        return OK;
    }
  • 相关阅读:
    同步和异步有何异同,在什么情况下分别使用他们?
    Android 缓存处理
    Android常用的设计模式概念
    Android常见的设计模式详解
    Android中的五大布局
    几种常见的引用概念
    面向对象的思想概述
    Android系统架构的简单描述
    display:none;与visibility:hidden;的区别
    块级元素和行内元素的区别
  • 原文地址:https://www.cnblogs.com/shamoof/p/3662386.html
Copyright © 2011-2022 走看看