数据结构之栈,栈是很多算法的基础知识,本文带你从0开始了解栈并手写一个栈
栈(Stack)
一、目录
1.栈的基本介绍
2.栈的相关术语
3.栈的特点
4.栈实现的基本思路
5.栈的图解
6.数组实现栈的原码
7.栈的应用
二、正文
1.栈的基本介绍
栈的英文为Stack,栈是一种数据结构,是用来存放数据的。栈存储数据遵循**先入后出原则**。
2.栈的相关术语
1)栈顶:数据变化的一端,是栈的顶部2)栈低:数据固定的一端,是栈的底部3)出栈(弹栈):英文pop,从栈中取出栈顶元素4)入栈(压栈):英文push,将元素压入栈中,处于栈顶位置5)栈溢出:数据超出了栈所能存放的最大容量
3.栈的特点
1)栈遵循先入后出原则,也就是先入栈的元素后出栈,后入栈的元素先出栈2)栈的入栈和出栈只能对栈顶元素进行操作【栈底是固定不能操作的】
4.栈实现的基本思路
使用数组【假设int类型数组】模拟栈数据结构的基本思路1)栈的属性private int maxSize;//栈的大小private int[] stack;//数组模拟栈,数据就放在该数组中private int top = -1;//top表示栈顶,初始化为-12)构造器(无参构造与有参构造) //无参构造public ArrayStack() {//默认给一个容量为10的栈maxSize = 10;stack = new int[maxSize];}//有参构造public ArrayStack(int maxSize){this.maxSize = maxSize;stack = new int[maxSize];}3)判断栈是否已满操作public boolean isFull(){//因为top是栈顶索引【下标】:所以top == maxSize - 1为truereturn top == maxSize - 1;}4)判断是否栈为空操作public boolean isEmpty(){return top == -1;}5)入栈push操作public void push(int value){//先判断是否满栈if (isFull()){System.out.println("栈已满,无法压栈!");return;}stack[++top] = value;//top索引先加1,再将值赋给栈顶} 6)实现出栈操作,每弹出一个数据【栈顶】,外部我们需要进行接收:public int pop(){//判断是否为空栈if (isEmpty())//由于空栈找不到一个合适的返回值,所以这里我们抛出运行时异常,程序直接结束throw new RuntimeException("栈为空,无法弹栈!");return stack[top--];} 7)遍历栈(只能从栈顶开始遍历)public void showStack(){//判断是否为空if (isEmpty()){System.out.println("栈为空,无法遍历!");return;}//只能从栈顶开始遍历for (int i = top;i >= 0;i--)System.out.printf("stack[%d] = %d\n",i,stack[i]);System.out.println();}
5.栈的图解
6.数组实现栈的原码以及注释
/*** 定义一个ArrayStack 表示栈*/
class ArrayStack{private int maxSize;//栈的大小private int[] stack;//数组模拟栈,数据就放在该数组中private int top = -1;//top表示栈顶,初始化为-1//构造器public ArrayStack() {//默认给一个10大小的栈maxSize = 10;stack = new int[maxSize];}public ArrayStack(int maxSize){this.maxSize = maxSize;stack = new int[maxSize];}/*** 1.判断栈是否满*/public boolean isFull(){return top == maxSize - 1;}/*** 2.判断是否栈空*/public boolean isEmpty(){return top == -1;}/*** 3.入栈【push】*/public void push(int value){//先判断是否满栈if (isFull()){System.out.println("栈已满,无法压栈!");return;}stack[++top] = value;}/*** 4.出栈【pop】*/public int pop(){//判断是否为空栈if (isEmpty())throw new RuntimeException("栈为空,无法弹栈!");return stack[top--];}/*** 5.遍历栈,只能从栈顶开始遍历*/public void showStack(){//判断是否为空if (isEmpty()){System.out.println("栈为空,无法遍历!");return;}//只能从栈顶开始遍历for (int i = top;i >= 0;i--)System.out.printf("stack[%d] = %d\n",i,stack[i]);System.out.println();}
}
7.栈的应用
栈的应用范围非常广泛,比如:1)递归算法2)java虚拟机的栈区3)二叉树数据结构的遍历4)方法的调用(不同方法的调用就是压栈的过程,前一个方法没有结束,后一个方法不会执行)5)中缀表达式转化为后缀表达式求值问题还有许许多多的算法以及实际问题需要用到栈这种数据结构,所以大家一定要掌握好栈的原理以及相关操作!
数据结构之栈,栈是很多算法的基础知识,本文带你从0开始了解栈并手写一个栈相关推荐
- 手写一个栈 java,数据结构|用java自己手写实现一个栈
javaDEMO 本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~ https ...
- 队列的基本操作_如果让你手写个栈和队列,你还会写吗?||CSDN博客精选
来源:华为云云享专家倪升武 昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都在用,但是都是别人封装好的集合. 确实,经典的数据结构,包括排序算法,虽 ...
- 如果让你手写个栈和队列,你还会写吗?
昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都在用,但是都是别人封装好的集合. 确实,经典的数据结构,包括排序算法,虽然我们平时不用手写了,但是这 ...
- 机器学习算法的基础知识
机器学习算法的基础知识 1.评估指标 2.偏差与方差(过拟合与欠拟合) 3.正则化(解决过拟合) 4.梯度下降算法(算法优化方式) 5.数据不平衡 1.评估指标 预测值 0 1 实际 0 TN FP ...
- 数据结构与算法学习——基础知识(一)
数据结构与算法 线性结构和非线性结构 基本概念 线性结构 非线性结构 稀疏数组 基本概念 稀疏数组的处理方法 举例说明 应用实例 代码实例 队列 基本介绍 示意图 数组模拟队列 思路分析 代码实现 数 ...
- 数据结构基础:算法的基础知识笔记
1.算法的概念 算法是问题求解过程中的精确描述,它为解决某一特定类型的问题规定了一个运算过程. 2.算法的特点 2.1 有穷性 一个算法必须在有穷的步骤结束后结束,并且每一步都在有穷时间内完成. 2. ...
- 菜鸟学算法一基础知识篇
菜鸟学算法<一>知识准备篇 刚刚上任,急着给兄弟们一点见面礼,嘿嘿 前言:论坛上有关算法分析的文章不少,也不少精品 但对于刚学CARACK来说,只是叹为观止 原因如下: 1.论坛高手如云, ...
- c语言程序的执行过程压栈,汉诺塔---手写出栈压栈过程实现
代码实现: 1 #include 2 3 //函数的形参A.B.C不一定代表的是A.B.C柱子,递归传参的时候会变化! 4 void hanoit(int n,char A,char B,charC) ...
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
原文:https://www.cnblogs.com/lshs/p/6038722.html 一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机 ...
最新文章
- 今年芯片行业最大收购案:亚德诺209亿美元收购美信,对抗行业老大德州仪器...
- Objective-C 日记⑤ 内存管理、协议、Category 视频笔记
- C++ 高级数据类型(二)—— 字符序列
- ElasticSearch多shard场景相关度打分不准确问题
- 腾讯优图升级为计算机视觉研发中心,与《科学》宣布战略合作
- java interface abstract
- swift 笔记 (十三) —— 继承
- 编写一个Linux 64位应用的注册机
- 使用Visual Studio 2010 Team System中的架构师工具(设计与建模)
- sql语句:CASE WHEN END 的用法
- html代码表白_作为一个程序员,表白都要玩出花样
- arcpy:TIF/IMG上色后转KMZ文件
- 笔记:数模美赛试题解析与研究
- 北京理工大学计算机学院嵩天,嵩天教授做客我校信息学院
- 饥荒联机服务器配置文件翻译,饥荒设置界面翻译图解
- 泰安链底层系统设计、核心优势、技术实现
- 【苏宁消费金融对接苏宁联盟链 打造金融区块链应用案例】
- 用python处理excel数据做函数_如何使用python通过函数式编程完成excel中的数据处理及分析工作...
- android studio distributionurl是干嘛的,不懂就学系列(一):gradle配置本地distributionUrl...
- urlencode、unquote