数据结构——栈

三、栈

定义: 是一种先进后出(First In Last Out )的线性表, 只允许一端插入或删除的。
栈有两种形式, 顺序存储和链式存储

栈的常见应用:
1、函数调用与递归:
每次函数调用时都会将当前函数的信息(如返回地址、局部变量等)压入栈中。当函数执行完毕后,这些信息会从栈中弹出,以便程序能恢复到调用前的状态。这种机制确保了函数调用的正确执行和返回。
递归调用是函数调用的一种特殊形式,它涉及到一个函数直接或间接地调用自身。在递归过程中,栈用于保存每一层递归的状态信息,包括参数、局部变量和返回地址。随着递归的深入,这些信息被依次压入栈中;而在递归返回时,它们又按照后进先出的顺序从栈中弹出。
2、表达式的求值与转化
3、内存管理:
在操作系统中,栈用于内存管理,在处理程序调用和系统中断时。每个线程或进程都有自己的栈空间,用于保存局部变量和临时数据。这种机制确保了不同线程或进程之间的数据隔离和安全性。

顺序结构:

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

//顺序结构
typedef struct {
    int items[MAX_SIZE];
    int top;
} Stack;

// 初始化栈
void initialize(Stack *s) {
    s->top = 0;
}

// 检查栈是否为空
int isEmpty(Stack *s) {
    return (s->top == 0);
}

// 检查栈是否已满
int isFull(Stack *s) {
    return (s->top == MAX_SIZE - 1);
}

// 入栈操作
void push(Stack *s, int new_item) {
    if (isFull(s)) {
        printf("ERROR: Stack is full\n");
        return;
    }
    s->top++;
    s->items[s->top] = new_item;
}

// 出栈操作
int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("ERROR: Stack is empty\n");
        return 0;
    }
    int item = s->items[s->top];
    s->top--;
    return item;
}

// 获取栈的长度
int size(Stack *s) {
    return (s->top + 1);
}

int main() {
    Stack my_stack;
    initialize(&my_stack);

    push(&my_stack, 10);
    push(&my_stack, 20);
    push(&my_stack, 30);

    printf("Top element is %d\n", pop(&my_stack));
    printf("Stack size is %d\n", size(&my_stack));

    return 0;
}
// 输出结果
Top element is 30
Stack size is 3
链式结构:

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 定义节点
typedef struct Node {
    int data;
    struct Node *next;
} Node;
// 定义栈结构
typedef struct {
    Node *top;
} LinkStack;

// 初始化
void initStack(LinkStack *stack) {
    stack->top = NULL;
}
// 栈是否为空
bool isStackEmpty(LinkStack *stack) {
    return stack->top == NULL;
}
// 入栈
bool push(LinkStack *stack, int item) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (newNode == NULL) {
        return false;
    }
    newNode->data = item;
    newNode->next = stack->top;
    stack->top = newNode;
    return true;
}
// 出战
bool pop(LinkStack *stack, int *item) {
    if (isStackEmpty(stack)) {
        return false;
    }
    *item = stack->top->data;
    Node *temp = stack->top;
    stack->top = stack->top->next;
    free(temp);
    return true;
}

int main() {
    LinkStack stack;
    initStack(&stack);
    
    // 示例操作:入栈和出栈
    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);
    
    int item;
    while (!isStackEmpty(&stack)) {
        pop(&stack, &item);
        printf("%d\n", item);
    }
    
    return 0;
}
//输出 
30
20
10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值