zoukankan      html  css  js  c++  java
  • c语言数据结构学习心得——栈

    栈(Stack)

    只允许在一端进行插入或删除操作的线性表

    栈顶(Top):栈中允许进行插入和删除操作的那一端;

    栈底(Bottom):固定的,不允许进行插入或删除的另一端

    1.栈是受限的线性表,所以自然具有线性关系。

    2.栈中元素后进先出。

    栈的顺序存储==顺序栈

    #define MaxSize 50             //定义栈中元素的最大个数
    typedef struct{
           Elemtype data[MaxSize]; //存放栈中元素
    }Sqstack;                      //顺序栈简写

    1.Top的值不能超过MaxSize;

    2.空栈的判定条件通常为top==-1,满栈的判定条件为top=MaxSize-1,栈中元素个数为top+1.

    顺序栈的操作:

    1.判空

    bool StackEmpty(SqStack S){
           if(S.top==-1) return true;
           else               return false;
    }

    2.进栈

    bool Push(SqStack &S,Elemtype x){
            if(S.top==MaxSize-1) return false;
              S.data[++S.top]=x; return true;
    }

    3.出栈

    bool Pop(SqStack &S,Elemtype &x){
          if(S.top==-1) return false;
          x=S.data[S.top--]; return true;
    }

    4.读取栈顶元素

    bool GetTop(SqStack S,Elemtype &x){
           if(S.top==-1) return false;
           x=S.data[S.top];return true;
    }

    共享栈

    顺序栈的存储空间大小需要事先开辟好,对每个栈各自单独开辟存储空间的利用率不如将各个栈存储空间共享

      栈满条件下:指针top1与指针top2只相差1,即top1+1=top2.

      结构:

    #define MaxSize 100            //定义栈中元素的最大个数
    typedef struct{
           Elemtype data[MaxSize]; //存放栈中元素
           int top1;
           int top2;
    }SqDoublestack;               //顺序共享栈简写

      进栈:

    bool Push(SqDoubleStack &S,ElemType x,int stackNum0{
            if(S.top1+1=S.top2) return false;
            if(stackNum==1) S.data[++S.top1]=x;//栈1有元素进栈
            if(stackNum==2) S.data[++S.top2]=x;//栈2有元素进栈
            return true;
    }

    栈的链式存储==链栈

    头指针当作栈顶指针,栈顶存放在单链表头部。

    typedef struct SNode{
            ElemType data;      //存放栈中元素
            struct SNode *next; //栈顶指针
    }SNode *SLink               //链栈的结点
    
    typedef struct LinkStack{
                 SLink top;    //栈顶指针
                 int count;    //链栈结点数
    }LinkStack                 //链栈

    1.链栈一般不存在满栈

    2.空栈的判定关系一般为top=NULL

    进栈

    bool Push(LinkStack &S,ElemType x){
        SLink p=(SLink)mallo((sizeof(SNode));//给新元素分配空间
        p->data=x;                           //新元素的值
        p->next=s->top;                      //p的后继指针指向新的元素
        s->top=p;                            //栈顶指针指向新的元素
        s->count++;                          //栈中元素加1
        return true;
    }

    出栈

    bool Pop(LinkStack &S, ElemType &x){
        if(S->top==NULL) return false;
        x=S->top->data;          //栈顶元素值
        Slink p=S->top;          //辅助指针
        S->top=S->top->next;     //栈顶指针后移
        free(p);                 //释放被删除数据的存储空间
        S->count--;  栈中元素个数减1
        return true;
    }
  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/suprechen/p/10597225.html
Copyright © 2011-2022 走看看