现在的位置: 首页 > 综合 > 正文

顺序栈的C语言实现

2013年10月12日 ⁄ 综合 ⁄ 共 2699字 ⁄ 字号 评论关闭

        栈是一种重要的数据结构,栈其实也是一种线性表,但是它只能在表尾进行插入和删除。

        栈其实就是记录线性表的起始跟结尾,以及表的容量的数据结构。

 

        例如定义一个栈的结构体:

       

typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

         结构中base指向线性表的表头元素,top指向线性表表尾元素,而stacksize记录栈的大小, 线性表有两种实现(顺序存储和链式存储),同样对应于栈也有相应的两种实现 方式,本文要实现的是顺序栈。

         下面是具体的代码:

         头文件stack.h

#ifndef __STACK_H__
#define __STACK_H__

#define STACK_INIT_SIZE      10
#define STACK_INCREMENT    5

#define TRUE      1
#define FALSE    0

typedef int bool;

typedef int SElemType;

typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;


typedef enum
{
    OVERFLOW=-2,
    EXIT_ERR=-1,
    EXIT_OK   
}Status;


#endif

       实现stack.c

/*
* Copyright (c)  2013
* This is a sample code of stack with C, every one can mody, distribute it.
*
* File Name     : stack.c
* Description   : Implement stack with C.
*
* Version        : Ver0.1
* Author         : Mingqiu.Zhang <zhang_mq@sina.com>
* Date            : 2013-03-04
*/

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

Status InitStack(SqStack *s)
{
    s->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

    if(NULL == s->base)
    {
        return OVERFLOW;
    }

    s->top = s->base;
    s->stacksize = STACK_INIT_SIZE;
    
    return EXIT_OK;
}


Status DestroyStack(SqStack *s)
{
    if(s->base !=NULL)
        free(s->base);

    s->top = s->base = NULL;
    s->stacksize = 0;

    return EXIT_OK;
}

Status ClearStack(SqStack *s)
{   
    if(s->top !=s->base)
    {
        memset(s->base, 0, (s->stacksize)*sizeof(SElemType));
        s->top = s->base;
    }

    return EXIT_OK;
}

bool StackEmpty(SqStack s)
{
    if(s.top == s.base)
        return TRUE;
    else
        return FALSE;
}

int StackLength(SqStack s)
{
    if((s.base != NULL) && (s.top != NULL))
        return s.top-s.base;
    else
        return EXIT_ERR;
}

Status GetTop(SqStack s, SElemType *e)
{
    if(s.base == s.top)
        return EXIT_ERR;

    *e =*(s.top-1);
    return EXIT_OK;
}


Status Push(SqStack *s, SElemType e)
{
    if(((s->top)-(s->base))/sizeof(SElemType) >= s->stacksize)
    {
        s->base = (SElemType *)realloc(s->base, (s->stacksize+STACK_INCREMENT)*sizeof(SElemType));

        if(NULL == s->base)
            return OVERFLOW;

        s->top = s->base+s->stacksize;
        s->stacksize+=STACK_INCREMENT;
    }

    *((s->top)++) = e;
}


Status Pop(SqStack *s, SElemType *e)
{
    if(s->top == s->base)
        return EXIT_ERR;
    
    *e=*(--(s->top));
    return EXIT_OK;
}


void visit(SElemType e)
{
    printf("%6d", e);
}

Status StackTraverse(SqStack s,  void (*f)(SElemType))
{
    while(s.top > s.base)
    {
        (s.top)--;
        f(*(s.top));
    }

    return EXIT_OK;
}




int main()
{
    int i;
    SElemType tmp;
    Status res;
    SqStack s;

    res = InitStack(&s);
    if(res != EXIT_OK)
    {
        printf("Initialize stack fail. \n");
        return res;
    }

    for(i=0; i<15; i++)
    {
        Push(&s, (SElemType)i);
    }
    printf("Members after push:\n");
    StackTraverse(s, visit);
    printf("\nCurrent the length of stack is %d.\n", StackLength(s));

    for(i=0; i<5; i++)
    {
        Pop(&s, &tmp);
        printf("Element %d is poped.\n", tmp);
    }

    printf("Members after pop:\n");
    StackTraverse(s, visit);
    printf("\nCurrent the length of stack is %d.\n", StackLength(s));

    GetTop(s, &tmp);
    printf("Now the top element is %d\n", tmp);

    res = DestroyStack(&s);
    if(res != EXIT_OK)
    {
        printf("Destroy Stack fail.\n");
        return res;
    }
    
    return 0;
}

上述代码在linux下可以正确的编译运行,下图是运行结果:

代码注释后续会加上

 

抱歉!评论已关闭.