纯 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;
}
程序运行结果如下
如果你对这个程序还有疑惑,在评论区留言,看到的话我会第一时间回复。