数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)


前言:在前面的文章中,我们讲解了顺序表,单链表,双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的,但是相较于顺序表和链表来说,栈的实现就非常简单了。

目录

一.栈(Stack)的概念

二.栈的数据结构

三.栈的实现

判断栈已满

判断栈非空

入栈push

出栈pop

查看栈顶元素

完整代码

Java版本

c语言版


一.栈(Stack)的概念

栈是一种先进后出(LIFO)的数据结构,在其中元素的的添加(称为“入栈”)和删除(称为“出栈”)仅在栈的顶部进行。因此,最后一个插入到栈中的元素是第一个从栈中删除的元素。

它通常有两个主要操作:

  • push:在栈的顶部插入一个元素。
  • pop:从栈的顶部移除一个元素。

栈的push入栈图解:

栈的pop出栈图解 :

我们可以看见对于栈的操作,我们都是在栈顶上操作的,先进来的元素会被后面的元素覆盖,而最后一个进来的元素也就是栈顶,因此我们称为先进后出(LIFO)

像传统的狙击步枪的弹夹就属于是一种栈的结构 


二.栈的数据结构

对于栈的实现,我们通常使用数组,当然也可以使用链表,不过相对而言数组的实现是更容易的。

而对于一个栈的数据结构,他首先得有存放元素的位置,我们这里选择用数组来存放,其次还得有栈内元素个数的记录:

public class MyStack {public int[] elem;public int usedSize;
}

三.栈的实现

对于一个栈,他应该有以下这些功能:

  • 入栈
  • 出栈
  • 判断栈是否为空
  • 判断栈已满
  • 查看栈顶元素

判断栈已满

当已经使用的数组的大小等于数组本身的大小的时候,栈就相当于满了

    public boolean isFull() {return usedSize == elem.length;}

判断栈非空

当数组内一个元素都没有,也就是已经使用的数组大小为0的时候,栈就是空的

    public boolean isEmpety() {return usedSize == 0;}

入栈push

当我们要将元素放入栈内的时候,先进行判断,只有在栈内还有剩余空间的情况下,我们才会进行入栈操作,如果没有剩余空间,我们就进行扩容

    public void push(int val) {if (isFull()) {//扩容elem = Arrays.copyOf(elem, elem.length * 2);}elem[usedSize++] = val;}

出栈pop

出栈前要先进行判断,如果栈内一个元素都没有,那自然是不能进行出栈操作的,我们就抛出一个自定义异常然后抛出;对于正常的出栈操作,我们拿出栈顶的元素,然后让记录数组的个数减一

    public int pop() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}int popNumber = elem[usedSize-1];usedSize--;return popNumber;}

查看栈顶元素

和出栈不一样的是,查看栈顶元素只是将元素拿出来展示,并没有实际上删除这个元素

    public int peek() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}return elem[usedSize - 1];}

完整代码

栈的整体实现相较于顺序表和链表是非常简单的,这里附上完整代码

Java版本

import java.util.Arrays;public class MyStack {public int[] elem;public int usedSize;public static int DEFULT_SIZE = 10;public MyStack() {this.elem = new int[DEFULT_SIZE];}public void push(int val) {if (isFull()) {//扩容elem = Arrays.copyOf(elem, elem.length * 2);}elem[usedSize++] = val;}public int pop() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}int popNumber = elem[usedSize-1];usedSize--;return popNumber;}public int peek() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}return elem[usedSize - 1];}public boolean isFull() {return usedSize == elem.length;}public boolean isEmpety() {return usedSize == 0;}}

c语言版

#include <stdio.h>
#include <stdlib.h>#define STACK_SIZE 10// 定义栈结构体
typedef struct {int data[STACK_SIZE];  // 存放数据的数组int top;               // 栈顶指针
} Stack;// 初始化栈
void init_stack(Stack *s) {s->top = -1;  // 栈顶初始化为-1
}// 判断栈是否为空
int is_empty(Stack *s) {return s->top == -1;
}// 判断栈是否已满
int is_full(Stack *s) {return s->top == STACK_SIZE-1;
}// 入栈
void push(Stack *s, int value) {if (is_full(s)) {printf("Stack overflow\n");exit(1);}s->data[++s->top] = value;  // 栈顶指针先加1,再将元素入栈
}// 出栈
int pop(Stack *s) {if (is_empty(s)) {printf("Stack underflow\n");exit(1);}return s->data[s->top--];  // 先将元素出栈,再将栈顶指针减1
}// 获取栈顶元素
int peek(Stack *s) {if (is_empty(s)) {printf("Stack underflow\n");exit(1);}return s->data[s->top];
}



  本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/268034.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据恢复

使用MySQL第三方工具binlog2sql binlog2sql&#xff0c;一款基于python开发的开源工具&#xff0c;是由大众点评团队的DBA使用python开发出来的&#xff0c;从MySQL binlog解析出你要的SQL。根据不同选项&#xff0c;你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。其功…

怎么在电脑桌面上使用备忘录软件?

在忙碌的办公室&#xff0c;上班族时常需要一款能帮助他们随时记录信息、待办事项和日程安排的备忘录软件。想象一下&#xff0c;你正在开会&#xff0c;突然想到了一个重要的待办事项&#xff0c;或者是接听了一个电话&#xff0c;得知了一个即将到期的任务。在这些情境下&…

python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)

今天讲一下图像入门学习教程---------图像分类。 图像分类是目标检测任务的基础&#xff0c;学会以下操作&#xff0c;打下良好基础&#xff01; 数据布置 以三分类为例&#xff0c;数据布置放置示例&#xff0c;也就是dataset下有两个文件夹&#xff1a;val和train。train和…

堆排序算法及实现

1、堆排序定义 堆是一棵顺序存储的完全二叉树。 其中每个结点的关键字都不大于其孩子结点的关键字&#xff0c;这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字&#xff0c;这样的堆称为大根堆。 举例来说&#xff0c;对于n个元素的序列{R0, R1, ... ,…

2023年度盘点:AIGC、AGI、GhatGPT、人工智能大模型必读书单

2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 LLM&#xff1a;Large Language Model&#xff0c;即大语言模型&#xff0c;旨在理解和生成人类语言。LLM的特点是规模庞大&…

苹果IOS应用上架AppStore的流程与教程

快打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程 第一步&#xff1a;创建app发布证书以及配置文件 1、打开苹果开发者中心网站&#xff1a;https://developer.apple.com&#xff0c;点击右上角 Account 使用开发者账号登录&#xff0c;如下图所示&#xff1a…

七大排序动态图

1.冒泡排序 2.插入排序 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c…

产品固件烧写方案

1、前言 一成熟的量产的嵌入式产品&#xff0c;软件一般分为BootLoader和App&#xff0c;BootLoader用于启动校验、App升级、App版本回滚等功能&#xff0c;BootLoader在cpu上电第一阶段中运行&#xff0c;之后跳转至App地址执行应用程序。 因此&#xff0c;在发布固件的时候&a…

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

传输层—UDP—校验和

传输层—UDP—校验和 学习一个协议&#xff0c;当然要掌握协议的特性&#xff0c;还需要理解协议报文格式。 UDP UDP 基本特点&#xff1a;无连接、不可靠传输、面向数据报、全双工 UDP报头包含&#xff1a;源端口、目的端口、UDP报文长度、校验和。 UDP载荷中&#xff1a…

C++STL算法库中谓词的使用

什么是c的谓词 谓词概念&#xff1a; 谓词函数是一个判断式&#xff0c;一个返回bool值的函数或者仿函数&#xff0c;有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。 常见的可以作为谓词的东西&#xff1a;函数、函数指针、函数对象、lambda表达式&am…

gprMax安装步骤

本来是想直接在base环境下直接弄的&#xff0c;但是报错了&#xff0c;因为base环境里的conda版本不匹配&#xff0c;于是重新建立虚拟环境gprMax&#xff0c;如下所示。 然后激活建立的gprMax环境&#xff0c;在gprMax环境中安装git 参考文章&#xff1a; https://zhuanlan.…