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

    镇楼图

    Pixiv:望月けい



    〇、栈构建前的细节问题

    采用顺序结构还是链式结构

    实现的方式有所不同,如果是临时使用且不存在已造好的轮子的情况下,我建议直接顺序结构实现,而且空间要足够大,不存在满栈一说,越简单越好

    由于栈本身操作受限,无论是顺序结构实现也好还是链式结构实现也好,之间的差别并不会特别影响时间复杂度

    不过有一点要说明,在使用出栈时,顺序结构的栈并非真的删除了元素(其值还保留在原处),而链式结构的栈确确实实会删除元素

    是否带头节点

    在实现中,一般顺序结构不带头节点简化操作,而链式结构会带上头节点方便只有一个元素时删除


    一、顺序栈

    顺序栈的实现极其简单,只需要带上栈顶指针即可

    typedef struct{
    	int value;
    }element,*Element;
    
    typedef struct{
    	Element data;//数组
        int top;//栈顶指针
        int len;//可容纳最大长度
    }stack;
    

    操作

    (1)创建栈

    void stack_create(stack &L,int length){
    	L.data = (Element)malloc(sizeof(element)*length);
        L.top = 0;
        L.len = length;
    }
    

    (2)清空栈

    void stack_clear(stack &L){
    	L.top = 0;
    }
    

    (3)删除栈

    void stack_delete(stack &L){
        realloc(L.data,0);
    }
    

    (4)判断是否空栈/满栈

    bool stack_iffull(stack L){
    	return (L.top == L.len) ? true : false ;
    }
    
    bool stack_ifempty(stack L){
    	return (!L.top) ? true : false ;
    }
    

    (5)入栈

    void stack_push(stack &L,element e){
        if(stack_iffull(L)){
    		printf("错误:满栈\n");
            return;
        }
        L.data[L.top++] = e;
    }
    

    (5)出栈

    element stack_pop(stack &L){
        if(stack_ifempty(L)){
    		printf("错误:空栈\n");
            return L.data[L.top+1];
        }
        return L.data[--L.top];
    }
    

    注:请注意所使用的栈是否包含虚拟节点,以及入栈前后、出栈前后栈顶指针的关系

    入栈具体操作细节:先将top指针向上移动,然后再插入数据

    出栈具体操作细节:先返回结果,然后再将top指针向下移动


    二、链栈

    链栈与顺序栈大体相同,但由于是链式结构,因此不必考虑长度原因,基本也不用考虑满栈的情况

    typedef struct{
    	int value;
    }element;
    
    typedef struct __stacknode{
    	element data;
        struct __stacknode *next;
    }stacksize,*stack;
    

    一般情况而言,为了方便实现,需要头指针

    入栈时采用头插法,而出栈也只需要从头部删除即可

    (1)创建栈

    void stack_create(stack &L){
    	L = (stack)malloc(sizeof(stacksize));
        L->next = NULL;
    }
    

    (2)清空栈

    void stack_clear(stack &L){
    	stack p1 = L,p2 = L->next;
        while(!p2){
    		p1 = p2;
            p2 = p2->next;
            free(p1);
        }
    }
    

    (3)删除栈

    void stack_delete(stack &L){
    	stack_clear(L);
        free(L);
    }
    

    (4)判断是否空栈

    bool stack_ifempty(stack &L){
        return (!L->next) ? true : false;
    }
    

    (5)入栈

    void stack_push(stack &L,element e){
    	stack newnode = (stack)malloc(sizeof(stacksize));
        newnode->data = e;
        newnode->next = L->next;
        L->next = newnode;
    }
    

    (6)出栈

    element stack_pop(stack &L){
    	if(stack_ifempty(L)){
            printf("错误:空栈\n");
            return L->data;
        }
        element e = L->next->data;
        stack p =L->next;
        L->next = L->next->next;
        free(p);
        return e;
    }
    


    参考教程

    C语言技术网 数据结构

  • 相关阅读:
    纯真IP数据库格式详解
    iframe框架详解
    搜刮的网址
    Drupal设置首页默认内容
    PHP开发之路之一WAMP的安装和配置
    PHP中json序列化后中文的编码显示问题
    Mysql转化blob为可读
    使用Xtrabackup来备份你的mysql
    MySQL压力测试工具mysqlslap的使用
    Cacti 监控 MySQL
  • 原文地址:https://www.cnblogs.com/AlienfronNova/p/15727329.html
Copyright © 2011-2022 走看看