zoukankan      html  css  js  c++  java
  • 栈(建立,销毁,判空,判满及入栈和出栈)

    栈的基本概念:

    逻辑线性结构,堆栈可以用数组实现,也可以用链表实现,堆栈的概念只是一个逻辑结构,而实现是物理结构。

    特点:

    1:单端入数据;

    2:先进后出

    代码实现如下:

    .h代码如下:

    #ifndef _MEC_STACK_H_
    #define _MEC_STACK_H_
    
    #include "mec.h"
    
    typedef struct MEC_STACK {
        void **stack;                     //定义一个类型是void **的名字为stack的数组,数组里面的元素的类型是void *;
        int capacity;                    //定义一个栈的容量表示;
        int top;                          //定义一个栈顶指针;
    }MEC_STACK;
    
    void initializeMecStack(MEC_STACK **head, int capacity);        //创建一个栈;*head以后可以更改主函数的值;
    void destoryMecStack(MEC_STACK **head);                              //销毁一个栈;
    boolean isMecStackEmpty(const MEC_STACK stackCtrl);              //判断栈是否为空栈;
    boolean isMecStackFull(const MEC_STACK stackCtrl);                  //判断栈是否已栈满;
    boolean push(MEC_STACK *head, void *value);                          //进行入栈操作;
    void *pop(MEC_STACK *head);                                           //进行出栈操作;
    
    #endif
    

    .c代码如下:

    #include <stdio.h>
    #include <malloc.h>
    
    #include "../include/mec_stack.h"
    #include "../include/mec.h"
    
    void initializeMecStack(MEC_STACK **head, int capacity) {         //定义一个无返回值类型的创建栈的函数,有两个形参,分别是控制头的首地址和栈的容量 
        if(NULL == head || NULL != *head || capacity <= 0) {                    //判断是否有控制头有就返回了还有判断容量是否大于0;
            return;
        }
        *head = (MEC_STACK *) calloc(sizeof(MEC_STACK));        //申请一个类型为 MEC_STACK *的控制头;
        (*head)->capacity = capacity;                              //让*head指向的空间的capacity等于形参capaciy;
        (*head)->top = 0;                                                 //让*head指向的空间的top值为零;
        (*head)->stack = (void **) calloc(sizeof(void *), capacity);     //申请一个真正的堆栈空间stack;
    }
    
    void destoryMecStack(MEC_STACK **head) {         //定义一个无返回值类型的销毁栈的函数,只需要需要控制头的首地址即 MEC_STACK **head
        if(NULL == head || NULL == *head) {
            return;
        }
        free((*head)->stack);             //先释放堆栈空间;
        free(*head);                    //再释放控制头的空间;
        *head = NULL;                    
    }
    
    boolean isMecStackEmpty(const MEC_STACK stackCtrl) {
        return 0 == stackCtrl.top;          //判断栈空;stackCtrl相当于head所指向的空间;
    }
     
    boolean isMecStackFull(const MEC_STACK stackCtrl) {   //判断栈满;
        return stackCtrl.top >= stackCtrl.capacity;
    }
    
    boolean push(MEC_STACK *head, void *value) {                //入栈;把value放进去类型为void*;
        if(NULL == head || NULL == value || isMecStackFull(*head)) {
            return FALSE;
        }
        
        head->stack[head->top++] = value;            //先赋值top再加1;  
        
        return TRUE;
    }
    
    void *pop(MEC_STACK *head) {                       //出栈;
        if(NULL == head || isMecStackEmpty(*head)) {
            return NULL;
        }
        
        return head->stack[--head->top];            //先top-1再赋值;
    }
    void *read_Top(MEC_STACK  stackCtrl){     //读取栈顶元素的值;
        if( isMecStackEmpty(stackCtrl)){
            return NULL;
        }
        return stackCtrl.stack[stackCtrl.top - 1] ;
    }
    
     
    
  • 相关阅读:
    IL查看泛型
    IL查看委托
    IL查看override
    为VS集成IL环境
    HashTable Dictionary HashMap
    C#集合类
    Resharper团队协作之TODO
    怪物彈珠Monster Strike 攻略
    [Editor]Unity Editor类常用方法
    C# Reflection BindingFlags
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/9026525.html
Copyright © 2011-2022 走看看