码迷,mamicode.com
首页 > 其他好文 > 详细

一个简单的C stack实现

时间:2016-05-09 21:59:52      阅读:558      评论:0      收藏:0      [点我收藏+]

标签:

用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 
{
    ElementType * bottom;                    //栈底指针
    ElementType * top;                        //栈顶指针
    int size;                                //栈大小
} MyStack;    

MyStack * initStack( int size);                            //初始化
Bool freeStack(MyStack * stack);                        //释放内存
Bool push(MyStack * stack, ElementType data);            
Bool pop(MyStack *stack, ElementType * outputData);
Bool isEmpty(MyStack *stack);
void makeStackEmpty(MyStack *stack);
void printStack(MyStack *stack);

#endif
//mystack。c
#include "mystack.h"

MyStack* initStack( int size)
{
    MyStack* 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;                        //初始化大小

    return stack;
}


Bool freeStack(MyStack * stack)
{
    if(stack!=NULL)
    {
        free(stack->bottom);
        free(stack);
        return 1;
    }
    else
    {
        return 0;
    }
}

void makeStackEmpty(MyStack *stack)
{
    if(stack!=NULL)
        stack->top = stack->bottom;
}

Bool isEmpty(MyStack *stack)
{
    if(stack != NULL)
    {
        if(stack->bottom == stack->top)
            return 1;
        else
            return 0;
    }
    else
        return 0;
}

Bool push(MyStack * stack, ElementType data)
{
    if(stack->top - stack->bottom >= stack->size)              //栈满
    {
        stack->bottom = (ElementType*)realloc(stack->bottom,          //分配内存,增加栈大小
            sizeof(ElementType*)*(stack->size + MYSTACK_INCREASE_NUM));
        if(stack->bottom == NULL)
            return 0;
        stack->top = stack->bottom + stack->size;                //初始化栈顶指针
        stack->size += MYSTACK_INCREASE_NUM;
    }
    *(stack->top)=data;                        //先存值
    stack->top++;                            //指针加1,指向下一内存单元
    return 1;
}

Bool pop(MyStack *stack, ElementType * outputData)
{
    if(isEmpty(stack))
    {
        printf("stack is empty\n");
        return 0;
    }
    stack->top--;                                //指针减1后指向栈中最顶上的元素
    *outputData = *(stack->top);                //取值
    return 1;
}

void printStack(MyStack *stack)
{
    if(stack!= NULL)
    {
        if(stack->bottom == stack->top)
        {
            printf("stack is empty\n");
        }
        else
        {
            /*for(int i = 0 ; i < stack->top - stack->bottom ; i++)
                printf("%d\n",stack->bottom[i] );*/
            ElementType * element = stack->bottom;
            for(;element != stack->top ; element++)
                printf("%d\n",*element);
        }
    }
}
//stacktest.c
#include "mystack.h"
#include <stdio.h>

 int main(int argc, char const *argv[])
{
    /* code */
    int a,b,c;
    MyStack* stack = initStack(2);
    push(stack,1);
    push(stack,2);
    printStack(stack);       //预期输出 1 、2
    push(stack,3);
    printStack(stack);        //预期输出 1、2、3
    pop(stack,&a);
    pop(stack,&b);
    push(stack,4);
    pop(stack,&c);
    printf("a=%d  b=%d c=%d\n",a,b,c );   //预期输出 a=3 b=2 c=4
    makeStackEmpty(stack);            
    pop(stack,&a);                    //预期输出 stack is empty
    printf("a=%d\n", a);            //预期输出 a=3
    freeStack(stack);

    return 0;
}

 

 

参考 :  百度文库

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

一个简单的C stack实现

标签:

原文地址:http://www.cnblogs.com/Zhang-Shangyu/p/5475526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!