当前位置: 首页 > news >正文

快速入门数据结构--栈

 一、栈

一、什么是栈?

栈(Stack) 是一种只能在一端进行插入和删除操作的线性数据结构。这一端被称为栈顶(Top),另一端固定不动,称为栈底(Bottom)

这里大家把它认为是一个水桶就行,记住一个特点:后进先出

二、栈的基本操作

操作作用
push()将一个元素压入栈顶
pop()将栈顶元素弹出并返回
peek() 或 top()查看栈顶元素但不移除它
isEmpty()判断栈是否为空
isFull()判断栈是否已满(适用于数组实现)
size()返回栈中元素的数量

三、栈的实现方式

1. 使用数组实现(静态栈)

定义结构体,顺序表这部分都懂

#define MAX_SIZE 100 // 最大容量typedef struct {int arr[MAX_SIZE]; // 存储栈的数组int top;           // 栈顶指针(初始为 -1)
} Stack;

初始化栈 

void initStack(Stack *s) {s->top = -1;//因为数组默认下标是0,空栈的下标设置为-1
}

压栈 push 

void push(Stack *s, int value) {if (!isFull(s)) {s->arr[++(s->top)] = value;//栈顶指针向上移动} else {printf("Stack overflow\n");}
}

弹栈 pop 

int pop(Stack *s) {if (!isEmpty(s)) {return s->arr[(s->top)--];//根压栈相反,取出来那栈顶指针就下移} else {printf("Stack underflow\n");return -1;}
}

查看栈顶 peek 

int peek(Stack *s) {if (!isEmpty(s)) {return s->arr[s->top];} else {printf("Stack is empty\n");return -1;}
}

 2. 使用链表实现(动态栈)

把它当成单链表就行,只不过多了个指向最后一个节点的top指针

代码演示一下吧 :

定义节点结构

typedef struct Node {int data;struct Node* next;
} Node;

定义栈结构

typedef struct {Node* top; // 栈顶指针
} Stack;

初始化栈

void initStack(Stack *s) {s->top = NULL;
}

判断栈空

int isEmpty(Stack *s) {return s->top == NULL;
}

压栈 push

void push(Stack *s, int value) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("Memory allocation failed\n");return;}newNode->data = value;newNode->next = s->top;s->top = newNode;
}

弹栈 pop

int pop(Stack *s) {if (!isEmpty(s)) {Node* temp = s->top;int value = temp->data;s->top = s->top->next;free(temp);return value;} else {printf("Stack underflow\n");return -1;}
}

查看栈顶 peek

int peek(Stack *s) {if (!isEmpty(s)) {return s->top->data;} else {printf("Stack is empty\n");return -1;}
}

下期明天更,睡觉了宝子们! 

相关文章:

  • 【云计算领域数学基础】组合数学优化
  • 1.19集成开发环境(IDE)
  • 从loader和plugin开始了解webpack
  • Alova 封装与 Vue 3 集成示例
  • 大模型笔记3:通过插件增强大模型的能力
  • RabbitMQ消息队列实战指南
  • 【Go语言-Day 1】扬帆起航:从零到一,精通 Go 语言环境搭建与首个程序
  • qt信号与槽--02
  • SpringBoot电脑商城项目--项目分析及搭建
  • 2011-2020年各省互联网接入端口数数据
  • 项目实训个人工作梳理
  • 抽象工厂1
  • Go实战项目OneX介绍(2/12):项目功能列表介绍
  • 力扣第 454 场周赛
  • Seata 全面深入学习指南
  • LeetCode 第75题:颜色分类
  • IDEA21中文乱码解决办法
  • Redis-CPP通用接口
  • 创始人IP如何崛起:系统化打造的实践路径 | 创客匠人
  • 【Git】代码托管服务
  • 水果网站建设的策划书/郑州seo顾问培训
  • 电子商务网站建设与实例/广州百度竞价托管
  • 郑州英文网站建设/长沙seo网站排名
  • 品牌展示设计网站/企业qq
  • 有梦商城公司网站/怎么做推广网站
  • 常宁做网站/百度怎么发帖做推广