zoukankan      html  css  js  c++  java
  • 数据结构--栈

    是一种被限制在只能在表的一端进行插入和删除运算的线性表。         (局部变量是用栈来保存的)


    可以进行插入和删除的一端称为 栈顶(top),另一端称为 栈底(bottom),当表中没有元素时(表长为0的栈)称为 空栈

    栈的修改是按 后进先出的原则进行,因此栈被称为后进先出(Last in first out)线性表。

      堆和栈是占一块内存的,栈向下存,堆向上存,当堆和栈相遇的时候内存就占满了
    存入与取出
         

    基本运算
    1.初始化
    InitStack(S)
    构造一个 空栈S

    2.StackEmpty(S)
    判断栈空,若S为空栈,则返回true,否则返回false

    3.StackFull(S)
    判断栈满,若S为满栈,则返回true,否则返回false
    注意:该运算只适合顺序栈的存储结构。

    如果栈需要很大内存的时候可以用 虚拟内存的方式,在物理内存不够的时候可以用磁盘的内存来虚拟内存使用。但会使速度变慢。

    4.Push(S,x)
    进栈,若栈S不满,则将元素x插入到S的栈顶。

    5.Pop(S)
    退栈,若栈S非空,则将S的栈顶元素删去,并返回该元素。

    6.StackTop(S)
    取栈顶元素,若栈S非空,则返回栈顶元素,但栈状态不变。

    顺序栈
    定义:栈的顺序存储结构。
    #define  LISTSIZE  100          //栈的最大容量
    typedef char DataType;         //保存的数据类型
    typedef struct                 //C程序员的使用技巧  SeqStack并不是变量而是struct结构体的别名,因此在C中定义结构变量需要加struct 所以用这种方式可以省去struct
    {
    DataType data[ LISTSIZE ];
    int  top;                 //栈顶指针
    }SeqStack;

    初始化 置栈空
    void InitStack(SeqStack *_S)
    {
    _S-> top =-1;
    }

    判断栈空
    bool StackEmpty(SeqStack* s)
    {
    return s->top==-1;
    }

    判断顺序栈满
    bool StackFull(SeqStack *s)
    {
    return  LISTSIZE -1==s-> top ;            栈顶指针指向内存-1,这样就是满了,因为栈顶指针从0开始。。
    }

    进栈
    bool Push(SeqStack* s,DataType x)
    {
    if(StackFull(s))
    return false;
    s->data[++s->top]=x;
    return true;
    }

    顺序退栈
    bool Pop(SeqStack* s,DataType* data)
    {
    if(StackEmpty(*s))
    return false;
    else
    {
    *data=s->data[s->top];
    s->top--;
    return true;
    }
    }


    链栈
    栈顶指针就是链表的头指针

    #define  LISTSIZE  100          //栈的最大容量
    typedef char DataType;         //保存的数据类型

    typedef struct stacknode{
    DataType date;                         //内容
    struct stacknode *next;            //指针
    }StackNode;

    typedef StackNode* LinkStack;

    初始化  置栈空
    void InitLinkStack(LinkStack *_S)
    {
    *_S=NULL;
    }

    判断链栈空
    bool StackLinkEmpty(LinkStack s)
    {
    return s==NULL;
    }

    虚拟内存
    bool VirtualMemory(LinkStack s)
    {
    FILE* stream;
    if(s == NULL)
    {
    if((stream = fopen("memory.txt","r+")) != NULL)
    {
    fseek(stream, -sizeof(StackNode), SEEK_END);
    fread(s,sizeof(StackNode),1,stream);
    while (NULL == s->next)
    {
    fseek(stream, -2 * sizeof(StackNode), SEEK_CUR);
    fread(s,sizeof(StackNode),1,stream);
    }
    fseek(stream, -sizeof(StackNode), SEEK_CUR);
    s->next = NULL;
    fwrite(s,sizeof(StackNode),1,stream);
    fclose(stream);
    return true;
    }
    else
    return false;
    }
    else
    {
    if((stream = fopen("memory.txt","a+")) != NULL)
    {
    s->next = (LinkStack) 1;
    fwrite(s,sizeof(StackNode),1,stream);
    fclose(stream);
    free(s);
    return true;
    }
    else
    return false;
    }
    }

    链栈进栈
    void Push(LinkStack* s,DataType x)
    {
    LinkStack p=(LinkStack)malloc(sizeof(stacknode));
    if(NULL==p)
    {
    VirtualMemory(s);
    p=(LinkStack)malloc(sizeof(stacknode));
    }
    p->data=x;
    p->next=*s;
    *s=p;
    }

    链栈退栈
    bool Pop(LinkStack* pStack,DataType* data)
    {
    if(StackEmpty(*pStack)))
    return false;
    LinkStack temp=*pStack;
    *data=temp->data;
    *pStack=temp->next;
    free(temp);
    temp=NULL;
    return true;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
    LinkStack top,bottom;
    InitLinkStack(&top);
    _getch();
    return 0;
    }

  • 相关阅读:
    Unity 3D:控制相机旋转、移动、缩放等功能
    电子公文传输系统验收3-开发环境
    冲刺 day7
    电子公文传输系统2-贡献排序
    程序运行
    实验三-电子公文传输系统1-个人贡献
    thread同步测试
    第五章学习总结
    第三周学习java第四章学习总结及体会!
    第一章学习过程问题小结
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3304071.html
Copyright © 2011-2022 走看看