一、系统栈
-
系统栈(System Stack):
- 用途:系统栈通常指的是调用栈(Call Stack),它用于存储程序执行期间的函数调用信息。每当一个函数被调用时,系统栈会记录这个调用的状态,包括返回地址、局部变量、参数、函数之间的调用关系等。
- 行为:系统栈是自动管理的,程序员通常不需要直接操作它。当函数执行完毕,系统栈会自动清理并返回到上一个函数调用的状态。
- 作用域:系统栈通常与程序的执行流程紧密相关,它帮助维护程序的执行上下文。
注意
- 保护现场的地址,是执行指令的下一条指令的地址
- 先进后处,后进先出,FILO
- 系统栈区是操作系统自己进行保护
二、数据结构中的栈
-
数据栈(Data Stack):
- 用途:数据栈通常指的是用户定义的栈,用于存储数据元素。数据栈可以用于各种算法和数据结构的实现,如表达式求值、括号匹配、函数调用的参数传递等。
- 行为:数据栈由程序员显式管理,需要程序员编写代码来执行
push
(入栈)和pop
(出栈)操作。 - 作用域:数据栈的作用域通常由程序员定义,它可以是全局的,也可以是局部的,取决于程序的设计。
- 数据结构栈:先进后出、后进先出
- 结构:只允许从一端进行数据的插入和删除的线性的存储结构
- 含有:栈顶(输入插入和删除的地方)和栈底
- 栈分为数据栈和链式栈
三、数据栈
3.1、满栈
1、入栈:先挪栈顶指针,再放入数据
2、出栈:先移出数据,再移动指针。
3.2、空栈
1、入栈:先放入输入,再移动栈顶指针
2、出栈:先移动栈顶指针,再数据弹出
3.3、增栈、减栈
栈的增长方向
入栈的方向
1、栈顶由内存高地址向低地址
2、栈顶从低地址向高地址
1、满增栈
入栈的方向是是增栈的方式,放入数据的是满栈的方式。
2、满减栈
入栈的方向是是减栈的方式,放入数据的是满栈的方式。
3、空增栈
入栈的方向是是增栈的方式,放入数据的是空栈的方式。
4、空减栈
入栈的方向是是减栈的方式,放入数据的是空栈的方式。
四、链式栈
4.1、操作
链式栈:
1、创建栈
Stack_t *create_stack()
{
Stack_t *stack = malloc(sizeof(Stack_t));
if(NULL == stack)
{
perror("fail stack");
return NULL;
}
stack->ptop = NULL;
stack->clen = 0;
return stack;
}
2、入栈
int push_stack(Stack_t *stack,Datatype data)
{
SNode_t *node = malloc(sizeof(SNode_t));
if(node == NULL)
{
perror("fail error");
return -1;
}
node->data = data;
node->pnext = NULL;
node->pnext = stack->ptop;
stack->ptop = node;
stack->clen++;
return 0;
}
3、出栈(看一下,出去的元素,所以和6一样)
int pop_stack(Stack_t *stack,Datatype *data)
{
if(stack->ptop == NULL)
{
return -1;
}
SNode_t *node = stack->ptop;
*data = stack->ptop->data;
stack->ptop = node->pnext;
free(node);
stack->clen--;
}
4、清空栈(把所有结点都删除)
void clear_stack(Stack_t *stack)
{
if(stack->ptop == NULL)
{
return;
}
SNode_t *node = stack->ptop;
while(stack->ptop != NULL)
{
SNode_t *node = stack->ptop;
stack->ptop = node->pnext;
free(node);
stack->clen--;
}
}
5、判空(判断该栈)
int is_empty_stack(Stack_t *stack)
{
if(stack->ptop == NULL)
{
return 1;
}
else
{
return 0;
}
}
6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)
int get_stack_top(Stack_t *stack,Datatype *data)
{
if(stack->ptop == NULL)
{
return -1;
}
*data = stack->ptop->data;
return 0;
}
7、销毁栈
void destory_stack(Stack_t *stack)
{
clear_stack(stack);
free(stack);
}
五、系统栈和数据结构中的区别
- 控制方式:系统栈由操作系统或运行时环境自动管理,而数据栈由程序员控制。
- 用途:系统栈主要用于跟踪函数调用和维护执行上下文,数据栈用于数据的临时存储和操作。
- 可见性:系统栈对程序员通常是不可见的,而数据栈是程序员可以直接操作的。
- 生命周期:系统栈的生命周期与函数调用的生命周期相关,而数据栈的生命周期由程序员定义。
- 相同之处:都是先进后出的结构,只是管理用户不同。