栈
数据结构的栈是一种特殊的线性表,遵循先进后出的特性;
顺序栈就像一个半封闭的容器栈底(bottom)不可操作,栈顶(top)可操作,比如垃圾桶,下面我画了图描述入栈和出栈
栈顶(top)会随数据的进入取出变化而变化。
下面用代码实现编写些功能测试效果
- 栈的初始化
- 清空释放栈
- 判断栈空、栈满
- 数据入栈(push)
- 数据出栈(pop)
- 返回栈顶元素数据
- 元素的数量
写个头文件(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;
}
下面是编译运行控制台输出的结果
数组栈中数据地址是连续的,优点是存取速度高效,通过下标来直接存储,缺点插入和删除比较慢容量长度固定。
栈是数据结构中相对比较容易理解的。多点思考,多点练习,孰能生巧。之后会复习队列和其他的数据结构。