杭州哪家做外贸网站好,注册贸易公司流程及费用,湛江论坛建站模板,做网站设计需要学会哪些一、概念
栈是一种先进后出的数据结构。FILO(firt in late out) 逻辑结构#xff1a;线性结构
二、存储结构#xff1a;
#xff08;一#xff09; 顺序存储
顺序栈 基于一个数组配合一个栈顶指针#xff08;数组下标#xff09;–top 顺序栈的本质就是对…一、概念
栈是一种先进后出的数据结构。FILO(firt in late out) 逻辑结构线性结构
二、存储结构
一 顺序存储
顺序栈 基于一个数组配合一个栈顶指针数组下标–top 顺序栈的本质就是对顺序表操作的一种约束只能在一端进行插入和删除。
操作 创建 清空 销毁 入栈、压栈——判断栈满 出栈、弹栈——判断栈空 打印栈所有元素
二链式存储
1. 结构体定义
//链表节点结构体----数据元素
typedef struct _Node{int data;struct _Node *next;
}node_t;//链式栈的结构体----数据对象
typedef struct _Stack{node_t *top;int count;//记录栈中元素个数//.....其他属性信息
}stack_t;2.创建栈表
1函数定义
int create_stack(stack_t **my_stack);
在内存中申请一块stack_t类型大小的空间存储栈的内容初始化栈的成员的数据将count置0top置NULL
2注意点
进入函数就需要判断传入的参数是否为NULL为空退出函数在申请完内存空间后判断申请空间是否成功失败退出函数
3代码实现
int create_stack(stack_t **my_stack){if(NULLmy_stack) //判断传入参数是否为空{return -1;}*my_stack(stack_t *)malloc(sizeof(stack_t));if(NULL*my_stack){return -1;}//初始化(*my_stack)-topNULL;(*my_stack)-count0;return 0;
}3. 入栈
1函数定义
int push_stack(stack_t *my_stack, int data);
在内存中申请一块node_t类型大小的数据空间进行头插count自加一
2注意点
需要检查传入参数是否为空为空退出函数top指向的元素即是第一个数据节点
3代码实现
int push_stack(stack_t *my_stack, int data){if(NULLmy_stack){return -1;}//申请一个新数据节点node_t *node(node_t *)malloc(sizeof(node_t));if(NULLnode){return -1;}node-nextmy_stack-top;my_stack-topnode;node-datadata;my_stack-count;return 0;
}3. 出栈
1函数定义
int pop_stack(stack_t *my_stack, int *num);
头删count自减
2注意点
需要检查传入指针参数和*num是否为空为空退出函数检查栈是否为空为空退出函数
3代码实现
//出栈
int pop_stack(stack_t *my_stack, int *num){if(NULLmy_stack||NULLnum){return -1;}if(is_empty(my_stack)){return -1;}//头删node_t *pdelmy_stack-top;*numpdel-data;my_stack-toppdel-next;free(pdel);pdelNULL;my_stack-count--;return 0;
}4. 判断栈是否为空
1函数定义
int is_empty(stack_t *my_stack);
2注意点
判断传入的指针参数是否为空
3代码实现
int is_empty(stack_t *my_stack){if(NULLmy_stack){return -1;}return (my_stack-count)?0:1;
}5. 清空栈
1函数定义
int clean_stack(stack_t *my_stack);
循环头删count置0只要top的指向不为空就一直循环
2注意点
入参合理性检查count不要忘记置0
3代码实现
int clean_stack(stack_t *my_stack){if(NULLmy_stack){return -1;}node_t *pdelNULL;while(my_stack-top){pdelmy_stack-top;my_stack-toppdel-next;free(pdel);}pdelNULL;my_stack-count0;return 0;
}6. 销毁栈
1函数定义
int destroy_stack(stack_t **my_stack);
2注意点
3代码实现
int destroy_stack(stack_t **my_stack){if(NULLmy_stack||NULL*my_stack){return -1;}//先清空再销毁if(clean_stack(*my_stack)){return -1;}free(*my_stack);*my_stackNULL;return 0;
}
7. 打印栈
1函数定义
int print_stack(stack_t *my_stack);
2注意点
入参合理性检查
3代码实现
int print_stack(stack_t *my_stack){if(NULLmy_stack){return -1;}if(is_empty(my_stack)){printf(栈空\n);return -1;}node_t *ptempmy_stack-top;for(int i0;imy_stack-count;i){printf(%d ,ptemp-data);ptempptemp-next;}putchar(10);return 0;
}