C 语言泛型栈

纯 C 语言实现的泛型栈

使用说明:

  • 新建栈
    newStack(int size,Stack * s);
    第一个参数,表示栈内单个元素占用空间的大小。
    第二个参数,表示栈的指针。
    例如,我们需要声明类型为 int 的一个整型栈
Stack s;
newStack(sizeof(int),&s);
  • 压栈
    stackPush(Stack *s,void * e);
    第一个参数,表示栈的指针。
    第二个参数,压入栈内元素的指针。
    例如,我们需要压入 int elem = 1 这个元素
int elem = 1;
stackPush(&s,&elem);
  • 出栈(安全)
    stackPop(Stack * s,void * e);
    第一个参数,表示栈的指针。
    第二个参数,返回栈内元素的指针。
    例如,我们需要取出栈顶元素
if(!stackPop(&s,&elem))
    printf("NULL\n");
else
	printf("%d\n",elem);
  • 额外的,如果你确保站内有元素,也可以直接
stackPop(&s,&elem);
printf("%d\n",elem);

下面给出程序源码


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

#define STATUS int

#define OK 1
#define ERR 0


typedef struct Elem
{
    void * elem;
    struct Elem * next;
} Elem;

typedef struct Stack
{
    Elem * elem;
    int u_size;
    Elem * top;
    int len;
} Stack;



STATUS newStack(int size,Stack * s);

STATUS stackPush(Stack *s,void * e);

STATUS stackPop(Stack * s,void * e);

STATUS newStack(int size,Stack * s)
{
    s->u_size = size;
    s->elem = NULL;
    s->top = NULL;
    s->len = 0;
    return OK;
}

STATUS stackPush(Stack * s,void * e)
{
    Elem * elem = (Elem *)malloc(sizeof(Elem));
    if(!elem)
        return ERR;

    elem->elem = (void *)malloc(sizeof(s->u_size));
    if(!elem->elem)
        return ERR;

    memcpy(elem->elem,e,s->u_size);
    elem->next = s->top;

    s->top = elem;
    s->len += 1;

    return OK;
}

STATUS stackPop(Stack * s,void * e)
{
    if(s->top == NULL)
        return ERR;

    memcpy(e,s->top->elem,s->u_size);

    Elem * p = s->top;
    s->top = s->top->next;
    s->len -= 1;

    free(p->elem);
    free(p);

    return OK;
}


int main()
{
    Stack s;
    newStack(sizeof(int),&s);

    int elem = 1;

    stackPush(&s,&elem);

    elem = 2;

    stackPush(&s,&elem);

    elem = 3;

    stackPush(&s,&elem);

    stackPop(&s,&elem);

    printf("%d\n",elem);

    stackPop(&s,&elem);

    printf("%d\n",elem);

    stackPop(&s,&elem);

    printf("%d\n",elem);

    if(!stackPop(&s,&elem))
        printf("NULL\n");

    return 0;
}

程序运行结果如下
程序运行结果

如果你对这个程序还有疑惑,在评论区留言,看到的话我会第一时间回复。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值