c 语言pop()函数,C --- pop()函数中的堆栈

如果你用c编写,有一种通用的编程方法。下面是一个示例如下: 头

typedef void *ElementAddr;

typedef void (*PfCbFree)(ElementAddr);

typedef struct StackRecord

{

ElementAddr *array;

int elemsize;

int loglength;

int alloclength;

PfCbFree freefn;

} *Stack;

/* Create a new stack */

Stack stack_create(int elemsize, PfCbFree freefn);

/* Dispose the stack */

void stack_dispose(Stack stk);

/* Make the given stack empty */

void stack_make_empty(Stack stk);

/* Return true if the stack is empty */

int stack_is_empty(Stack stk);

/* Insert a new element onto stack */

void stack_push(Stack stk, ElementAddr elemaddr);

/* Delete the top element off the stack */

void stack_pop(Stack stk);

/* Fetch the top element from the stack */

void stack_top(Stack stk, ElementAddr elemaddr);

/* Fetch & Delete the top element from the stack */

void stack_top_and_pop(Stack stk, ElementAddr elemaddr);

的.cpp

#define MIN_STACK_SIZE (4)

/* Create a new stack */

Stack

stack_create(int elemsize, PfCbFree freefn)

{

Stack stk;

stk = malloc(sizeof(struct StackRecord));

if (stk == NULL) {

fprintf(stderr, "Out of memory\n");

exit(1);

}

stk->array = malloc(elemsize * MIN_STACK_SIZE);

if (stk->array == NULL) {

fprintf(stderr, "Out of memory\n");

exit(1);

}

stk->elemsize = elemsize;

stk->loglength = 0;

stk->alloclength = MIN_STACK_SIZE;

}

/* Dispose the stack*/

void

stack_dispose(Stack stk)

{

stack_make_empty(stk);

free(stk->array);

free(stk);

}

/* Make the given stack empty*/

void

stack_make_empty(Stack stk)

{

if (stk->freefn) {

int i;

for (i = 0; i < stk->loglength; ++i) {

stk->freefn((char *)stk->array +

i * stk->elemsize);

}

}

stk->loglength = 0;

}

/* Return true if the stack is empty*/

int

stack_is_empty(Stack stk)

{

return stk->loglength == 0;

}

static void

stack_grow(Stack stk)

{

stk->alloclength *= 2;

stk->array = realloc(stk->array,

stk->alloclength * stk->elemsize);

}

/* Insert a new element onto stack */

void

stack_push(Stack stk, ElementAddr elemaddr)

{

ElementAddr target;

if (stk->loglength == stk->alloclength)

stack_grow(stk);

target = (char *)stk->array + stk->loglength * stk->elemsize;

memcpy(target, elemaddr, stk->elemsize);

stk->loglength++;

}

/* Delete the top element off the stack */

void

stack_pop(Stack stk)

{

ElementAddr target;

if (stack_is_empty(stk)) {

fprintf(stderr, "Empty stack\n");

exit(1);

}

if (stk->freefn) {

target = (char *)stk->array +

(stk->loglength-1) * stk->elemsize;

stk->freefn(target);

}

stk->loglength--;

}

/* Fetch the top element from the stack */

void

stack_top(Stack stk, ElementAddr elemaddr)

{

void *target = (char *)stk->array +

(stk->loglength-1) * stk->elemsize;

memcpy(elemaddr, target, stk->elemsize);

}

/* Fetch & Delete the top element from the stack */

void

stack_top_and_pop(Stack stk, ElementAddr elemaddr)

{

ElementAddr target;

if (stack_is_empty(stk)) {

fprintf(stderr, "Empty stack\n");

exit(1);

}

target = (char *)stk->array +

(stk->loglength-1) * stk->elemsize;

memcpy(elemaddr, target, stk->elemsize);

stk->loglength--;

}

您可以将其用于任何数据类型。这里是一个测试代码

#include

#include

#include

#include "generic-stack.h"

void strfreefn(ElementAddr elemaddr)

{

free(*(char **)elemaddr);

}

int

main(int argc, char **argv)

{

Stack int_stk, str_stk;

int i;

char *names[] = {

"C", "C++", "Jave", "C#", "Python",

"PHP", "Basic", "Objective C", "Matlab", "Golang"

};

/* test integer stack */

printf("Test integer stack\n");

int_stk = stack_create(sizeof(int), NULL);

for (i = 0; i < 10; ++i) {

stack_push(int_stk, &i);

}

while (!stack_is_empty(int_stk)) {

int val;

stack_top_and_pop(int_stk, &val);

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

}

stack_dispose(int_stk);

/* test string stack */

printf("Test string stack\n");

str_stk = stack_create(sizeof(char *), strfreefn);

for (i = 0; i < 10; ++i) {

char *copy = strdup(names[i]);

char *dest;

stack_push(str_stk, ©);

}

while (!stack_is_empty(str_stk)) {

char *dest;

stack_top_and_pop(str_stk, &dest);

printf("%s\n", dest);

free(dest);

}

stack_dispose(str_stk);

return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值