zoukankan      html  css  js  c++  java
  • 前面我们讲到了容器,今天我们接着讨论另外一种数据结构:
    堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。

    那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面:

    1)堆栈的数据是先入后出

    2)堆栈的长度取决于栈顶的高度

    那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下:

    #ifndef _stack_h
    #define _stack_h


    #include
    <stdio.h>
    #include
    <stdlib.h>
    #define EMPTYSTACK -1
    #define MINSTACKSIZE 5


    typedef
    struct stackRecord
    {
        
    int
    capacity;
        
    int
    topOfStack;
        
    void **
    array;
    }
    *
    stack;
    //stack s ==> struct stackRecord * s;
    int
    isEmpty(stack s);
    int
    isFull(stack s);

    stack createStack(int maxElementsNumber);
    void
    disposeStack(stack s);
    int push(void *
    e, stack s);
    void *
    top_element(stack s);
    int
    pop(stack s);
    void *
    topAndPop(stack s);
    int
    getStackLength(stack s);

    #endif

    #include "stack.h"

    int main(int argv, char *
    argc[])
    {
         stack s;
         s
    = createStack(5
    );
         push((
    void *)5
    , s);
         printf(
    "The Stack's length is %d "
    , getStackLength(s));

         push((
    void *)6
    , s);
         printf(
    "The Stack's length is %d "
    , getStackLength(s));

         printf(
    "The top element is %d ", (int
    )top_element(s));
         pop(s);

         printf(
    "The Stack's length is %d "
    , getStackLength(s));
         pop(s);
       
    //
    pop(s);
       
    // disposeStack(s);
         pop(s);
         push((
    void*)8
    ,s);
         printf(
    "The top element is %d ", (int
    )top_element(s));
        
    return 0
    ;
    }

    int
    isEmpty(stack s)
    {
      return s->topOfStack ==
    EMPTYSTACK;
    }

    int
    isFull(stack s)
    {
      return (s->topOfStack + 1) == s->
    capacity;
    }
    void
    disposeStack(stack s)
    {
        s
    ->topOfStack = -1
    ;

       
    if (s !=
    NULL) {
            free(
    *s->
    array);
           
    *s->array =
    NULL;
            free(s
    ->
    array);
            s
    ->array =
    NULL;
      
    //   free(s);
        }
    }

    stack createStack(
    int
    maxElements)
    {
        stack s
    = (stack)malloc(sizeof(struct
    stackRecord));

       
    if (maxElements <
    MINSTACKSIZE)
            perror(
    "Stack size is too small."
    );
       
    if (s ==
    NULL)
            perror(
    "Out of space!"
    );

        s
    ->array = (void **)malloc(sizeof(void *) *
    maxElements);
        s
    ->capacity =
    maxElements;
        s
    ->topOfStack = -1
    ;

       
    return
    s;
    }

    int push(void *
    e, stack s)
    {
       
    if (!
    isFull(s))
        {
            s
    ->array[++s->topOfStack] =
    e;
           
    return 0
    ;
        }
       
    else
            return 1
    ;
    }

    /* when the stack is empty it'll return 0 */
    void *
    top_element(stack s)
    {
          if (!
    isEmpty(s))
                
    return s->array[s->
    topOfStack];
          
    else
                return
    NULL;
    }

    int
    pop(stack s)
    {
       
    if (!
    isEmpty(s))
        {
            s
    ->array[s->topOfStack--] = ''
    ;
           
    return 0
    ;
        }
       
    else

        {
            printf(
    "it is empty ! ");
           
    return 1
    ;
        }
    }

    void *
    topAndPop(stack s)
    {
       
    void *
    e;
         e
    =
    top_element(s);
         pop(s);
         
    return
    e;
    }
    int
    getStackLength(stack s)
    {
      return (s->topOfStack+1
    ) ;
    }

  • 相关阅读:
    RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示
    Quartz.Net实现作业定时调度详解
    微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
    微信公众号开发C#系列-12、微信前端开发利器:WeUI
    微信公众号开发C#系列-11、生成带参数二维码应用场景
    微信公众号开发C#系列-10、长链接转短链接
    微信公众号开发C#系列-9、多公众号集中管理
    微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
    微信公众号开发C#系列-7、消息管理-接收事件推送
    微信公众号开发C#系列-5、用户和用户组管理-支持同步
  • 原文地址:https://www.cnblogs.com/chengliangsheng/p/3597084.html
Copyright © 2011-2022 走看看