C语言实现顺序栈心得

栈的构成及初始化

对于“先进后出”的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量。

栈容量即栈的最大容量,若超过会产生溢出错误。当然,必要时也可以扩充容量。

栈元素可以通过动态数组( base[] )存放。初始化时用 malloc 申请(栈容量 * 元素类型)个空间。

栈顶指针用于记录栈元素个数,始终指向栈顶元素的上一个单位(如 栈顶元素为base[3],栈顶指针为4),这样就能实现元素个数的记录。不过,栈顶指针只是一种形象化的叫法,方便起见,一般将其定义为 int 型。初始化时,栈顶指针置0。

 

定义结构体

struct sta
{
    int top;
    int *base;
    int size;
};

typedef struct sta ZAN;

 

栈的建立(分配空间)

ZAN* create()
{
    ZAN *p;

    p=(ZAN *)malloc(sizeof(ZAN));

    return p;
}

 

栈的初始化

void zer(ZAN *s)
{
    s->top=0;
    s->size=INI;                        //#define INI 10
    s->base=(int *)malloc(INI*sizeof(int));
}

 

压栈

压栈就是让元素进栈,栈顶指针 top 加一,元素存入数组 base[] 。如果已经栈满,可以增加内存空间(实际上是重新分配空间),此时栈容量 size 也要加一。用返回值判断是否压栈成功。

 

int push(ZAN *s,int x)
{

    if( (s->top) >= (s->size) )
    {
        s->base=(int *)realloc(s->base,(s->size+1)*sizeof(int));
        if(!s->size) return 0;
        s->size++;
    }
    s->top++;
    s->base[s->top-1]=x;
    return 1;

}

 

取栈顶元素

取顶只用把栈顶元素的值记录下来,而不需要让其出栈。可以用指针来取值。同样,用返回值判断是否取顶成功。

 

int gettop(ZAN *s,int *e)
{
    if(s->top==0) return 0;
    else
    {
        *e=s->base[(s->top)-1];
        return 1;
    }
}

 

弹栈

弹栈是取出其值,并让栈顶元素出栈,top减一。同样,用指针记录其值,用返回值判断是否弹栈成功。

 

int pop(ZAN *s,int* e)
{
    if(!s->top) return 0;
    else
    {
        *e=s->base[(s->top)-1];
        s->top--;
        return 1;
    }
}

 

求栈长

取出 top 的值即可

 

int getlen(ZAN* s)
{
    return s->top;
}

 

判断栈是否为空

看 top 是否为0即可

 

int isempty(ZAN* s)
{
    if(!s->top) return 0;
    else return 1;
}

 

输出栈元素

将 base[] 自顶向下输出即可,不对栈进行任何操作。

 

void list(ZAN* s)

{

  int i;

 

  puts("\n list ZAN:");

  for(i=s->top-1;i>=0;i--)

  {

    if(i!=s->top-1) printf("\n");          //此处可以用空格代替换行

    printf("%d",s->base[i]);

  }

  puts("");

}

 

测试功能

 

// TEST FUNCTION

main()
{
    ZAN *create();
    void zer(ZAN *s);
    int push(ZAN *s,int x);
    int gettop(ZAN *s,int *e);
    int getlen(ZAN* s);
    int isempty(ZAN* s);
    void list(ZAN* s);
    ZAN *s;
    int n,*e,i=1;

    i=1;e=&i;                                                           // protect


    s=create();                                                         // create a stack
    zer(s);                                                             // initialize

    if(!isempty(s)) puts("ZAN is empty\n");                               // empty?
    else puts("ZAN is not not empty\n");

    puts(" push int x:");                // push an element in
    scanf("%d",&n);
    if(push(s,n)) ;
    else printf(" push %d error\n",n);

    if(gettop(s,e)) printf("gettop %d\n",*e);                      // get top element
    else puts("gettop error");

    printf("\n push int x:\n");
    scanf("%d",&n);
    if(push(s,n)) ;                                            // push an element in
    else printf("push %d error\n",n);


    if(gettop(s,e)) printf("gettop %d\n",*e);                      // get top element
    else puts("gettop error");

    if(pop(s,e)) printf("pop %d\n",*e);          //pop top element
    else printf("pop %d error\n",n);

    if(gettop(s,e)) printf("gettop %d\n",*e);                      // get top element
    else puts("gettop error");

    if(!isempty(s)) puts("ZAN is empty\n");                               // empty?
    else puts("ZAN is not not empty\n");
    if(isempty(s)) list(s);

    printf("\n push int x:\n");
    scanf("%d",&n);
    if(push(s,n)) ;                                            // push an element in
    else printf("push %d error\n",n);

    if(isempty(s)) list(s);                  //output ZAN
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。