栈—数据结构

一、系统栈
  1. 系统栈(System Stack)

    • 用途:系统栈通常指的是调用栈(Call Stack),它用于存储程序执行期间的函数调用信息。每当一个函数被调用时,系统栈会记录这个调用的状态,包括返回地址、局部变量、参数、函数之间的调用关系等。
    • 行为:系统栈是自动管理的,程序员通常不需要直接操作它。当函数执行完毕,系统栈会自动清理并返回到上一个函数调用的状态。
    • 作用域:系统栈通常与程序的执行流程紧密相关,它帮助维护程序的执行上下文。

注意

  • 保护现场的地址,是执行指令的下一条指令的地址
  • 先进后处,后进先出,FILO
  • 系统栈区是操作系统自己进行保护
二、数据结构中的栈
  1. 数据栈(Data Stack)

    • 用途:数据栈通常指的是用户定义的栈,用于存储数据元素。数据栈可以用于各种算法和数据结构的实现,如表达式求值、括号匹配、函数调用的参数传递等。
    • 行为:数据栈由程序员显式管理,需要程序员编写代码来执行push(入栈)和pop(出栈)操作。
    • 作用域:数据栈的作用域通常由程序员定义,它可以是全局的,也可以是局部的,取决于程序的设计。
  1. 数据结构栈:先进后出、后进先出
  2. 结构:只允许从一端进行数据的插入和删除的线性的存储结构
  3. 含有:栈顶(输入插入和删除的地方)和栈底
  4. 栈分为数据栈和链式栈
三、数据栈
3.1、满栈

1、入栈:先挪栈顶指针,再放入数据

2、出栈:先移出数据,再移动指针。

3.2、空栈

1、入栈:先放入输入,再移动栈顶指针

2、出栈:先移动栈顶指针,再数据弹出

3.3、增栈、减栈

栈的增长方向

入栈的方向

1、栈顶由内存高地址向低地址

2、栈顶从低地址向高地址

1、满增栈

入栈的方向是是增栈的方式,放入数据的是满栈的方式。

2、满减栈

入栈的方向是是减栈的方式,放入数据的是满栈的方式。

3、空增栈

入栈的方向是是增栈的方式,放入数据的是空栈的方式。

4、空减栈

入栈的方向是是减栈的方式,放入数据的是空栈的方式。

四、链式栈
4.1、操作

栈—数据结构_第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);
}
五、系统栈和数据结构中的区别
  • 控制方式:系统栈由操作系统或运行时环境自动管理,而数据栈由程序员控制。
  • 用途:系统栈主要用于跟踪函数调用和维护执行上下文,数据栈用于数据的临时存储和操作。
  • 可见性:系统栈对程序员通常是不可见的,而数据栈是程序员可以直接操作的。
  • 生命周期:系统栈的生命周期与函数调用的生命周期相关,而数据栈的生命周期由程序员定义。
  • 相同之处:都是先进后出的结构,只是管理用户不同。

你可能感兴趣的:(数据结构,java,开发语言)