zoukankan      html  css  js  c++  java
  • 堆栈

    1.2堆栈(Stack)及实现

    1.2.1堆栈的定义

    具有一定操作约束的线性表,只在一端(栈顶top)做插入(push)、删除(pop),后进先出(LIFO)

    1.2.2栈的存储实现

    1.2.2.1栈的顺序存储实现

    通常由一个一维数组和一个记录栈顶元素位置的变量组成。

     1 #define MaxSize 100//堆栈元素的最大个数
     2 typedef int ElementType;
     3 typedef struct SNode* Stack;
     4 struct SNode
     5 {
     6     ElementType Data[MaxSize];//存储堆栈元素
     7     int top;//记录栈顶元素的下标
     8 };
     9 Stack S;
    10 
    11 //初始化
    12 Stack CreatStack() {
    13     S = (Stack)malloc(sizeof(SNode));
    14     S->top = -1;//说明堆栈中从0下标开始都没有存储数据
    15     return S;
    16 }
    17 
    18 //是否已满
    19 int IsFull(Stack S) {
    20     return (S->top == MaxSize - 1);
    21 }
    22 
    23 //是否空
    24 int IsEmpty(Stack S) {
    25     return (S->top == -1);
    26 }
    27 
    28 //入栈
    29 void Push(Stack S, ElementType item) {
    30     if (iSFull(S)) {
    31         printf("栈已满");
    32         return;
    33     }
    34     S->top++;//栈顶元素先加1
    35     S->Data[S->top] = item;//栈顶指向的位置存放item
    36     return;
    37 }
    38 
    39 //出栈 同时返回栈顶元素
    40 ElementType Pop(Stack S){
    41     if (IsEmpty(S)) {
    42         printf("栈已空");
    43         return 0;
    44     }
    45     ElementType val = S->Data[S->top];
    46     S->top--;//先取出再释放位置
    47     return val;
    48 }

    1.2.2.2栈的链式存储实现

    栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在栈顶进行。

    typedef int ElementType;
    typedef struct SNode* Stack;
    
    struct SNode
    {
        ElementType Data;
        Stack Next;//指向下一个结点
    };
    
    Stack S;
    
    //初始化
    Stack CreateStack() {
        Stack S;
        S = (Stack)malloc(sizeof(SNode));
        S->Next = NULL;//建立一个头结点
        return S;
    }
    
    //判断是否为空
    int IsEmpty(Stack S) {
        return (S->Next == NULL);
    }
    
    //入栈
    void Push(Stack S, ElementType item) {
        Stack tmp;//建立一个结点,将结点插入链表
        tmp = (Stack)malloc(sizeof(SNode));
        tmp->Data = item;//将元素值存入结点的数据域
        //链栈栈顶元素是链表头结点,新入栈的结点在栈顶元素后面
        //相当于新入栈的元素总是插在链表的第二个位置上
        tmp->Next = S->Next;
        S->Next = tmp;
    }
    
    //出栈
    ElementType Pop(Stack S) {
        Stack First;//出栈的结点
        ElementType TopVal;//出栈的结点的数据域
        if (IsEmpty(S)) {
            printf("栈已空");
            return 0;
        }
        First = S->Next;//指向待删除的结点
        S->Next = First->Next;
        TopVal = First->Data;
        free(First);
        return TopVal;
    }
    作者:PennyXia
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    可扩展多线程异步Socket服务器框架EMTASS 2.0
    认识迅雷界面引擎
    C语言 二维数组(指针)动态分配和释放(转)
    二维数组与双重指针(转)
    VC++6 调用teststand api的方法
    [VC6] 小谈如何解决VC6.0 open崩溃的问题(已解决)(转)
    Linux下C与Mysql的混合编程(转)
    VS2010生成安装包制作步骤 (转)
    SAO总结
    JS OOP编程
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12591023.html
Copyright © 2011-2022 走看看