zoukankan      html  css  js  c++  java
  • 一个简单的C stack实现

    用C语言实现了一个简单的栈。基本思路是定义一个栈结构体,里面有两个指针和一个表示栈大小的int。两个指针分别指向栈底和栈顶,当栈底指针和栈顶指针重合时,说明栈为空;当栈顶指针减去栈底指针的值大于等于栈的大小,说明栈已满。

    
    
    //mystack.h

    #ifndef mystack_H
    #define mystack_H #include <stdio.h> #include <stdlib.h> #define MYSTACK_INCREASE_NUM 2 typedef int ElementType; //暂定为int typedef int Bool; typedef struct mystack { struct mystack * _this; //this ElementType * bottom; //栈底指针 ElementType * top; //栈顶指针 int size; //栈大小 Bool (*freeStack)(); Bool (*push)(ElementType data); Bool (*pop)(ElementType *outputData); Bool (*isEmpty)(); void (*makeStackEmpty)(); void (*print)(); } MyStack; MyStack * initStack( int size); //初始化 Bool freeStack(); //释放内存 Bool push(ElementType data); Bool pop(ElementType * outputData); Bool isEmpty(); void makeStackEmpty(); void print(); #endif
    
    
    
     
    
    
    //mystack.c
    #include "mystack.h"
    
    
    MyStack * initStack( int size);                            //初始化
    Bool freeStack();                        //释放内存
    Bool push(ElementType data);            
    Bool pop(ElementType * outputData);
    Bool isEmpty();
    void makeStackEmpty();
    void print();
    
    MyStack* stack = NULL;
    
    MyStack* initStack( int size)
    {
        stack = (MyStack*)malloc(sizeof(MyStack));                    //分配内存
        if(stack==NULL)
            return NULL;
        stack->bottom = (ElementType*)malloc(sizeof(ElementType)*size);
        if(stack->bottom == NULL)
            return NULL;
        stack->top = stack->bottom;                //初始化为空栈   栈顶指针和栈底指针指向同一位置
        stack->size = size;                        //初始化大小
    
        stack->freeStack = freeStack;
        stack->push = push;
        stack->pop = pop;
        stack->isEmpty =isEmpty;
        stack->makeStackEmpty = makeStackEmpty;
        stack->print = print;
        stack->_this = stack;
    
        return stack;
    }
    
    
    Bool freeStack()
    {
        if(stack->_this!=NULL)
        {
            free(stack->_this->bottom);
            free(stack->_this);
            return 1;
        }
        else
        {
            return 0;
        }
    }
    
    void makeStackEmpty()
    {
        if(stack->_this!=NULL)
            stack->_this->top = stack->_this->bottom;
    }
    
    Bool isEmpty()
    {
        if(stack->_this != NULL)
        {
            if(stack->_this->bottom == stack->_this->top)
                return 1;
            else
                return 0;
        }
        else
            return 0;
    }
    
    Bool push(ElementType data)
    {
        if(stack->_this->top - stack->_this->bottom >= stack->_this->size)
        {
            stack->_this->bottom = (ElementType*)realloc(stack->_this->bottom,
                sizeof(ElementType*)*(stack->_this->size + MYSTACK_INCREASE_NUM));
            if(stack->_this->bottom == NULL)
                return 0;
            stack->_this->top = stack->_this->bottom + stack->_this->size;
            stack->_this->size += MYSTACK_INCREASE_NUM;
        }
        *(stack->_this->top)=data;                        //先存值
        stack->_this->top++;                            //指针加1,指向下一内存单元
        return 1;
    }
    
    Bool pop(ElementType * outputData)
    {
        if(isEmpty())
        {
            printf("stack is empty
    ");
            return 0;
        }
        stack->_this->top--;                                //指针减1后指向栈中最顶上的元素
        *outputData = *(stack->_this->top);                //取值
        return 1;
    }
    
    void print()
    {
        if(stack->_this!= NULL)
        {
            if(stack->_this->bottom == stack->_this->top)
            {
                printf("stack is empty
    ");
            }
            else
            {
                /*for(int i = 0 ; i < stack->top - stack->bottom ; i++)
                    printf("%d
    ",stack->bottom[i] );*/
                ElementType * element = stack->_this->bottom;
                for(;element != stack->_this->top ; element++)
                    printf("%d
    ",*element);
            }
        }
    }
    
    
    
     
    #include "mystack.h"
    #include <stdio.h>
    
    
    int main(int argc, char const *argv[])
    {
        /* code */
        int a,b,c;
        MyStack* stack = initStack(2);
        stack->push(1);
        stack->push(2);
        stack->print();       //预期输出 1 、2
        stack->push(3);
        stack->print();        //预期输出 1、2、3
        stack->pop(&a);
        stack->pop(&b);
        stack->push(4);
        stack->pop(&c);
        printf("a=%d  b=%d c=%d
    ",a,b,c );   //预期输出 a=3 b=2 c=4
        stack->makeStackEmpty();            
        stack->pop(&a);                    //预期输出 stack is empty
        printf("a=%d
    ", a);            //预期输出 a=3
        stack->freeStack();
    
        return 0;
    }

    参考 :  百度文库

        http://blog.csdn.net/mci2004/article/details/7532205

  • 相关阅读:
    学习数据结构的网站
    线程的自动释放、挂起、运行
    centos7 odbc mysql
    c++和c不同
    Linux挂载u盘作为本地yum源安装gcc
    构建基于JAVASCRIPT的移动WEB CMS入门——简介(转载)
    数据库SQL优化大总结之 百万级数据库优化方案
    webgl 刷底色的基本步骤
    前端下载文件流并且获取heads中的filename文件名且解决中文乱码的方法
    Python little knowledge
  • 原文地址:https://www.cnblogs.com/Zhang-Shangyu/p/5475526.html
Copyright © 2011-2022 走看看