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

顺序栈的实现C语言

2012年12月23日 ⁄ 综合 ⁄ 共 1652字 ⁄ 字号 评论关闭

没有什么要讲的。顺序栈的结构体里:头指针,尾指针,还有栈的容量。构建栈的时候,就是寻找出一片大小合适的内存空间,并用结构体里的尾指针指向这片空间。头指针开始也是指向这片空间的。压栈就是:先判断空间是否足够?不够的话,继续分配空间;够的话给头指针指向的结点赋值,并把头结点向后移一位(也就是说头指针始终指着的空间中data没有任何值)。弹栈就是:首先将头指针移回一个单位,然后将用e返回栈顶的值。

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

#define STACK_INIT_SIZE 100
#define STACKINCREAMENT 10

#define OVERFLOW    -1
#define ERROR  0
#define OK 1

typedef int Status;
typedef int ElemType;

typedef struct 
{
        ElemType *base;
        ElemType *top;
        int  stacksize;
} st;

Status InitStack(st &ss)
{
       ss.base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
       if (!ss.base) exit(OVERFLOW);
       ss.top = ss.base;
       ss.stacksize = STACK_INIT_SIZE;
       return OK;
}
Status GetTop(st &ss, ElemType &e)
{
       if (ss.base == ss.top)
       return ERROR;
       e = *(ss.top - 1);
       return OK;
}
Status Push(st &ss, ElemType e)
{
       if (ss.top - ss.base >= ss.stacksize)
       {
          ss.base = (ElemType*)realloc(ss.base, ss.stacksize + STACKINCREAMENT * sizeof(ElemType));
          if (!ss.base) exit(OVERFLOW);
          ss.top = ss.base + ss.stacksize;
          ss.stacksize = ss.stacksize + STACKINCREAMENT * sizeof(int);
       }
       *ss.top = e;
       ss.top++;
       return OK;
}
Status Pop(st &ss, ElemType &e)
{
       if (ss.top == ss.base) return ERROR;
       e = *(--ss.top);
       return OK;
}

Status DestroyStack(st &ss)
{
       free(ss.base);
       ss.base = NULL;
       ss.top = NULL;
       ss.stacksize = 0;
       return OK;
} 

Status CleatStack(st &ss)
{
       ss.top = ss.base;
       ss.stacksize = STACK_INIT_SIZE;
       return OK;
}

int StackEmpty(st &ss)
{
       if (ss.top == ss.base)
       return 1;
       return 0;
}

int StackLen(st &ss)
{
    return (ss.top - ss.base);
}


void print(st &ss)
{
     int m = StackLen(ss);
     int i;
     for (i = 0; i < m; i++)
     {
         ElemType e;
         Pop(ss,e);
         printf("%d ", e);
     }
     printf("\n");
     return ;
}
int main()
{
    st ss; 
    InitStack(ss); 
    int m, i;
    if(StackEmpty(ss)) printf("empty\n");
    printf("how many nums do you want to printf\n");
    scanf("%d", &m);
    for (i = 0; i < m; i++)
    {
        int e;
        scanf("%d", &e);
        Push(ss, e);
    }
    printf("%d\n", StackLen(ss));
    print(ss);
    system ("pause");
    return 0;
    
} 

抱歉!评论已关闭.