为什么栈的实现很多人写不出来
一 前言
本篇使用数组的方式实现栈,当然重点不在使用了什么样的数据结构去实现另一种数据结构,也可以使用动态数组,链表来实现栈;知识追寻者觉得比较重要的是实现一种数据结构的思路;比如栈,只要知道了如何去实现栈的思路,后面不就是敲敲几行代码的事情么,反之三思后行古人早就教给我们了;当然本文只提供一种简单的实现方式,肯定有许多不足之处;
二 栈的实现
2.1栈的含义
- 栈是一种有序的线性表,只能在一端插入数据和删除数据,最后插入的数据也就是最先被删除的数据;通常栈也被称为先进后出或者后进先出的线性表结构;
- 栈的定义看起来对初学者可能有点模糊,读者可以想象一下工厂里面的玻璃,一块一块玻璃从地面开始叠的高高的,取得时候是从最高层得一块玻璃往下取;
- 看下面一张经典得栈结构图,中间是原本得栈大小为3,栈顶的数值为3;如果往栈顶加入一个数值4,就会变为左边的图,此时栈顶为4,栈大小为4;如果中间栈的删除一个元素,就会变为右边的图,此时栈顶值为2,栈大小为2;
2.2 栈的重要数据类型
通过前面说明介绍可以详细的认识到使用栈避不开,栈的栈顶值(top),栈的添加操作(push),栈的删除操作(pop),栈的当前大小(size);通常每种数据结构都有一个初始容量值(capacity),当栈的当前大小超出容量值,也就是溢栈,也就是很多文章里面很多提到的 stack overflow;
2.3 数组实现方式
- 入栈push实现思路; 栈顶索引 + 1;
- 出栈pop实现思路;栈顶索引-1;
- 栈顶值peek就是栈顶索引;
/**
* @Author lsc
* <p>数组栈实现 </p>
*/
public class ArrayStack {
// 容量
private int capacity;
// 数组栈
private long[] stackArray;
// 栈顶
private int top;
// 构造
public ArrayStack(int size) {
// 设置容量大小
capacity = size;
// 创建数组
stackArray = new long[capacity];
// 栈顶初始值为 -1 表示空栈
top = -1;
}
// 入栈
public void push(long data) {
// 索引加1
stackArray[++top] = data;
}
// 出栈
public long pop() {
// 索引减1
return stackArray[top--];
}
// 栈顶值
public long peek() {
return stackArray[top];
}
// 判定是否是空栈
public boolean isEmpty() {
return (top == -1);
}
// 判定栈是否已满
public boolean isFull() {
return (top == capacity - 1);
}
}
测试
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(6);
arrayStack.push(1);
arrayStack.push(2);
System.out.println(arrayStack.pop());
System.out.println(arrayStack.peek());
System.out.println(arrayStack.isEmpty());
System.out.println(arrayStack.isFull());
}
输出
2
1
false
false
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix