C数据结构之栈(数组实现)

数据结构的栈是一种特殊的线性表,遵循先进后出的特性;
顺序栈就像一个半封闭的容器栈底(bottom)不可操作,栈顶(top)可操作,比如垃圾桶,下面我画了图描述入栈和出栈
在这里插入图片描述
栈顶(top)会随数据的进入取出变化而变化
下面用代码实现编写些功能测试效果

  1. 栈的初始化
  2. 清空释放栈
  3. 判断栈空、栈满
  4. 数据入栈(push)
  5. 数据出栈(pop)
  6. 返回栈顶元素数据
  7. 元素的数量

写个头文件(stackarr.h)定义声明函数

#ifndef _STACKARR_H
#define _STACKARR_H
#include<sys/types.h>
typedef struct stack_arr
{
	int *arr;
	int cap;
	int top;
}STACK_ARR;
/*栈的初始化*/
void stack_init(STACK_ARR* stack,size_t cap);
/*清空栈*/
void stack_deinit(STACK_ARR* stack);
/*判断栈满*/
int stack_full(STACK_ARR* stack);
/*判断栈空*/
int stack_empty(STACK_ARR* stack);
/*入栈*/
void stack_push(STACK_ARR* stack,int data);
/*出栈*/
int stack_pop(STACK_ARR* stack);
/*返回栈顶数据*/
int stack_top(STACK_ARR* stack);
/*元素数量*/
int stack_size(STACK_ARR* stack);
#endif

下面是stack_arr.c文件,函数的具体实现

#include<stdio.h>
#include<stdlib.h>
#include"stackarr.h"
/*栈的初始化*/
void stack_init(STACK_ARR* stack,size_t cap)
{
	stack->arr=malloc(cap*sizeof(int));/*分配内存*/
	stack->cap=cap;/*栈的容量大小*/
	stack->top=0;/*栈顶位置初始化为0*/
}
/*清空栈*/
void stack_deinit(STACK_ARR* stack)
{
	free(stack->arr);
	stack->arr=NULL;
}
/*判断栈满*/
int stack_full(STACK_ARR* stack)
{
	//当栈顶超出预先设定的高度是则说明栈满了
	return stack->top>=stack->cap;
}
/*判断栈空*/
int stack_empty(STACK_ARR* stack)
{
	//栈顶为0时,栈为空
	return !stack->top;
}
/*入栈*/
void stack_push(STACK_ARR* stack,int data)
{
	//随着元素加人栈顶对应上升
	stack->arr[stack->top++]=data;
}
/*出栈*/
int stack_pop(STACK_ARR* stack)
{
	//随着元素加出栈顶对应下降
	stack->top--;
	return stack->arr[stack->top];
}
/*返回栈顶数据*/
int stack_top(STACK_ARR* stack)
{
	return stack->arr[stack->top-1];
}
/*元素数量*/
int stack_size(STACK_ARR* stack)
{
	return stack->top;
}
/*main 函数*/
int main(int argc, char const *argv[])
{
	STACK_ARR stack_arr;
	stack_init(&stack_arr,6);
	/*入栈*/
	for (int i = 0; !stack_full(&stack_arr); ++i)
	{
		stack_push(&stack_arr,i+1);
		printf("%d入栈成功\n",i+1);
	}
	/*输出元素个数*/
	printf("元素个数为:%d\n",stack_size(&stack_arr));
	printf("\n");
	/*输出栈*/
	printf("栈的输出顺序如下:\n");
	while(!stack_empty(&stack_arr))
	{
		printf("栈顶:%d\n",stack_top(&stack_arr));

		printf("数据为:%d\n",stack_pop(&stack_arr));
	}
	/*清空栈*/
	stack_deinit(&stack_arr);
	printf("栈已清空。。\n");
	return 0;
}

下面是编译运行控制台输出的结果

数组栈中数据地址是连续的,优点是存取速度高效,通过下标来直接存储,缺点插入和删除比较慢容量长度固定。
栈是数据结构中相对比较容易理解的。多点思考,多点练习,孰能生巧。之后会复习队列和其他的数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值