数据结构:线性结构(2)

第二节

栈:栈是功能受限的表,只有一个接口管理数据的进出,其特点是先进后出

顺序栈:容量有限(容器)
出入栈都是以下标为基础,一般常用于,表达式解析,内存管理(为函数调用提供支持)

typedef struct StackArray
{
	TYPE* arr;	// 存储空间首地址
	int top;	// 栈顶
	size_t len;	// 容量
}StackArray;

// 创建
StackArray* create_stack_array(size_t len)
{
	StackArray* stack = malloc(sizeof(StackArray));
	stack->arr = malloc(sizeof(TYPE)*len);
	stack->len = len;
	stack->top = 0;
}

// 销毁
void destory_stack_array(StackArray* stack)
{
	free(stack->arr);
	free(stack);
}

// 栈空
bool empty_stack_array(StackArray* stack)
{
	return !stack->top;
}

// 栈满
bool full_stack_array(StackArray* stack)
{
	return stack->top >= stack->len;
}

// 入栈
bool push_stack_array(StackArray* stack,TYPE data)
{
	if(full_stack_array(stack)) return false;
	stack->arr[stack->top++] = data;
	return true;
}

// 出栈
bool pop_stack_array(StackArray* stack)
{
	if(empty_stack_array(stack)) return false;
	stack->top--;
	return true;
}

// 栈顶
TYPE* top_stack_array(StackArray* stack)
{
	if(empty_stack_array(stack)) return NULL;
	return stack->arr + stack->top - 1;
}

链式栈:容量可以是无限的

Node* create_node(TYPE data)//创建结点
{
	Node* node = malloc(sizeof(Node));
	node->data = data;
	node->next = NULL;
	return node;
}

Stack* create_stack(void)//创建链式栈
{
	Stack* stack = malloc(sizeof(Stack));
	stack->top = NULL;
	return stack;
}

bool empty_stack(Stack* stack)栈空
{
	return stack->top == NULL;
}

bool pop_stack(Stack* stack)//出栈
{
	if(empty_stack(stack)) return false;
	Node* temp = stack->top;
	stack->top = temp->next;
	free(temp);
	return true;
}

void destory_stack(Stack* stack)//销毁栈
{
	while(!empty_stack(stack))
	{
		pop_stack(stack);
	}
	free(stack);
}

void push_stack(Stack* stack,TYPE data)//入栈
{
	Node* node = create_node(data);
	node->next = stack->top;
	stack->top = node;
}

bool top_stack(Stack* stack,TYPE* p)//栈顶
{
	if(empty_stack(stack)) return false;
	*p = stack->top->data;
	return true;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值