堆栈 - 采用数组实现 - C语言

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

#define MAX_STACK_SIZE  10
#define STACK_TRUE  0
#define STACK_FALSE 1
#define STACK_ERROR -1

struct stack {
	char *data[MAX_STACK_SIZE];
	int top_index;
	int (*is_empty)(struct stack *);
	int (*is_full)(struct stack *);
	char *(*pop)(struct stack *);
	int (*push)(struct stack *, const char *);
};

int is_empty(struct stack *mystack)
{
	if(NULL == mystack)
		return STACK_ERROR;

	if(mystack->top_index >= 0)
		return STACK_FALSE;

	return STACK_TRUE;
}

int is_full(struct stack *mystack)
{
	if(NULL == mystack)
		return STACK_ERROR;

	if(mystack->top_index == (MAX_STACK_SIZE-1))
		return STACK_TRUE;

	return STACK_FALSE;
}

char * pop(struct stack *mystack)
{
	char *item;	

	if(NULL == mystack)
		return NULL;

	item = mystack->data[mystack->top_index];
	mystack->data[mystack->top_index--] = NULL;
	return item;
}

int push(struct stack *mystack, const char *item)
{
	char *ele = NULL;

	if(NULL == mystack || NULL == item)
		return STACK_ERROR;

	if(is_full(mystack) == STACK_TRUE)
		return STACK_FALSE;

	ele = (char *)malloc((strlen(item)+1)*sizeof(char));
	strcpy(ele, item);
	
	mystack->data[++mystack->top_index] = ele;

	return STACK_TRUE;
}


int main()
{
	int i, len = 0;
	char *ele;
	
	struct stack mystack = {
		.data = {NULL},
		.top_index = -1,
		.is_empty  = is_empty,
		.is_full   = is_full,
		.pop	  = pop,
		.push      = push,
	};
	
	mystack.push(&mystack, "One");
	mystack.push(&mystack, "Two");
	mystack.push(&mystack, "Three");
	mystack.push(&mystack, "Four");
	mystack.push(&mystack, "Five");
	mystack.push(&mystack, "Six");
	mystack.push(&mystack, "Seven");
	mystack.push(&mystack, "Eight");
	mystack.push(&mystack, "Nine");

	/* pop */
	len = mystack.top_index;
	for(i = 0; i <= len; i++) {
		ele = mystack.pop(&mystack);
		printf("%s\n", ele);
		free(ele);
	}
	printf("stack is empty:%d(STACK_TRUE=0)\n", mystack.is_empty(&mystack));		

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值