【自己动手写数据结构】 -- 简单顺序栈的实现


/*
 * 简单顺序栈的实现
 */
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

/*
 * 自定义bool类型
 */
typedef int BOOL ;
#define TRUE 1
#define FALSE 0

const int STACK_INIT_SIZE = 100;
const int STACK_INCREMENT = 20;

typedef int datatype;
typedef struct {
	datatype *base;
	datatype *top;
	//栈的最大容量
	int maxSize;
}Stack;

/*
 * 顺序栈的初始化
 */
BOOL initStack(Stack *s) {
	//使用malloc函数给栈分配空间
	s->base = (datatype *)malloc(STACK_INIT_SIZE*sizeof(datatype));
	if(s->base == NULL) {
		return FALSE;
	}
	//初始化是栈顶和栈低指针相同
	s->top = s->base;
	s->maxSize = STACK_INIT_SIZE;
	return TRUE;
}

/*
 * 往顺序栈中插入一个元素
 */
BOOL push(Stack *s, datatype elem) {
	//若超出范围则重新分配空间
	if(s->top - s->base >= s->maxSize) {
		printf("超出范围!\n");
		s->base = (datatype *)realloc(s->base,
				(STACK_INIT_SIZE + STACK_INCREMENT)*sizeof(datatype));
		if(s->base == NULL) {
			printf("分配失败!\n");
			return FALSE;
		}
		s->top = s->base + s->maxSize;
		s->maxSize += STACK_INCREMENT;
	}
	//elem插入栈中,并作为栈顶元素
	*(s->top) = elem;
	//top指向栈顶元素的下一个位置
	s->top++;
	return TRUE;
}

/*
 * 取得顺序栈的栈顶元素
 */
BOOL getTop(Stack s, datatype *elem) {
	if(s.top == s.base){
		printf("栈中无元素\n");
		return FALSE;
	}
	*elem = *(s.top-1);
	return TRUE;
}

/*
 * 删除顺序栈的栈顶元素
 */
BOOL pop(Stack *s, datatype *elem) {
	if(s->top == s->base) {
		printf("栈中无元素\n");
		return FALSE;
	}
	s->top--;
	*elem = *(s->top);
	return TRUE;
}

/*
 * 顺序栈的长度
 */
int length(Stack s) {
	return (s.top - s.base);
}

/*
 * 	清空顺序栈
 */
void clear(Stack *s) {
	s->top = s->base;
}

/*
 * 打印栈中的元素
 */
void printStack(Stack *s) {
	datatype *p = s->base;
	while(p != s->top) {
		printf("%d ", *p);
		p++;
	}
}

PS:在使用malloc函数动态分配空间时由于没有引入<malloc.h>头文件会发生    "隐式声明与内建函数 ‘malloc’ 不兼容"错误,

         这时引入相应的头文件即可。








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值