数据结构:栈

1.栈的概念:

1.栈是限定仅在表尾进行插入或删除的线性表。对于栈来说表尾具有特殊性,称为栈顶,相应表头被称为栈底。不含元素的空表被称为空栈。

2.栈的修改是按照先进后出的原则,因此栈又称为先进后出的线性表。

2.栈的基本操作:

1.栈的数据插入:表尾插入

2.栈的数据删除:表尾删除

3.站的初始化、判空以及取栈顶元素

3.代码实现(以c语言为例)

1.顺序栈(利用一组地址连续的存储单元依次存取自栈底到栈顶的元素)

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 100

typedef struct {
    int *top;
    int *base;
    int stacksize;
} Stack;

void initStack(Stack *p) {
    p->base = (int *)malloc(STACKSIZE * sizeof(int));
    if (p->base == NULL) {
        printf("Memory allocation failed\n");
        exit(1);
    }
    p->top = p->base;
    p->stacksize = STACKSIZE;
}

int getTop(Stack *p, int *e) {
    if (p->top == p->base) {
        return -1; // Stack is empty
    }
    *e = *(p->top - 1);
    return 0; // Success
}

void push(Stack *p, int m) {
    if (p->top - p->base >= p->stacksize) {
        p->base = (int *)realloc(p->base, (p->stacksize + STACKSIZE) * sizeof(int));
        if (p->base == NULL) {
            printf("Memory reallocation failed\n");
            exit(1);
        }
        p->top = p->base + p->stacksize;
        p->stacksize += STACKSIZE;
    }
    *p->top++ = m;
}

int pop(Stack *p, int *e) {
    if (p->top == p->base) {
        return -1; // Stack is empty
    }
    *e = *--p->top;
    return 0; // Success
}

int main() {
    Stack p;
    int e, e1, e2;

    initStack(&p);

    push(&p, 3);
    push(&p, 4);
    push(&p, 5);

    if (pop(&p, &e) == -1) {
        printf("Stack is empty\n");
    }
    if (pop(&p, &e1) == -1) {
        printf("Stack is empty\n");
    }
    if (pop(&p, &e2) == -1) {
        printf("Stack is empty\n");
    }

    printf("%d, %d, %d\n", e, e1, e2);

    // Free the allocated memory
    free(p.base);

    return 0;
}

运行结果

cs 复制代码
5, 4, 3

2.也可以用链表实现栈。

4.应用场景:

1.括号匹配:

使用栈来验证字符串中的括号是否正确匹配。

2.浏览器历史记录:

浏览器使用栈来记录用户的访问历史,支持返回上一页的功能。

3.函数调用:

在程序运行时,函数调用的执行上下文会被压入调用栈中。

5.优缺点:

1.优点:实现简单,操作高效。支持先进后出的操作模式,适用于许多实际问题。

2.缺点:空间利用率可能不高(尤其是固定大小的数组实现),不支持随机访问,只能访问栈顶元素。

相关推荐
_F_y5 分钟前
C++重点知识总结
java·jvm·c++
打工的小王6 分钟前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
毕设源码-赖学姐7 分钟前
【开题答辩全过程】以 高校体育场馆管理系统为例,包含答辩的问题和答案
java·spring boot
我真会写代码9 分钟前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design9 分钟前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
java干货14 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y14 分钟前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
DN金猿15 分钟前
接口路径正确,请求接口却提示404
java·tomcat
毕设源码-郭学长15 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
皮皮哎哟21 分钟前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序