当前位置:网站首页>学习栈的心得和总结(数组实现)
学习栈的心得和总结(数组实现)
2022-08-09 09:10:00 【羽化登仙°】
堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。
常与另一种有序的线性数据集合队列相提并论。
堆栈常用一维数组或链表来实现。
栈(数组实现)
- 操作
堆栈使用两种基本操作:推入(压栈,push)和弹出(弹栈,pop): - 推入:将数据放入堆栈顶端,堆栈顶端移到新放入的数据。
弹出:将堆栈顶端数据移除,堆栈顶端移到移除后的下一笔数据。 - 栈的简单示意图

- 特点
堆栈的基本特点: - 先入后出,后入先出。
除头尾节点之外,每个元素有一个前驱,一个后继。
好了,上面简单介绍了栈的含义和栈的特点,下面用代码来实现一下栈。
- 首先我们需要创建栈,它的成员变量包括一个要创建栈的最大值,也就是创建数组的最大值,需要一个top指针在最开始的时候指向-1,创建数组stack[],创建构造器来创建栈结构。
class stack{
private int maxNum;
private int top = -1;
private int stack[];
public stack(int num) {
// TODO Auto-generated constructor stub
this.maxNum = num;
stack = new int[this.maxNum];
}
}
- 判断栈空和栈满
//判断栈是否已满
//因为top最开始指向-1,如果指向了栈空间最大-1的话说明已经指向了栈顶,栈也就是满栈
public boolean isFull() {
return top == maxNum-1;
}
//判断栈是否为空,如果top仍然指向-1说明栈没有元素添加进来,仍然是一个空栈
public boolean isEmpty() {
return top == -1;
}
- 入栈,将元素添加到栈中
public void push(int value) {
//判断栈是否已满
if (isFull()) {
System.out.println("栈已满!!!");
return;
}
//top由-1指向了栈的第一个位置
top++;
//将要入栈的元素入栈
stack[top] = value;
}
- 出栈,将元素从栈中取出
//出栈
public int pop() {
//判断栈是否为空
if (isEmpty()) {
throw new RuntimeException("栈为空,无法出栈!!!");
}
//定义一个变量用来接收要出栈的值
int value;
value = stack[top];
//当元素出栈后top移向下一个栈空间
top--;
//返回出栈的元素
return value;
}
- 遍历栈中元素(显示栈的情况)
//遍历栈中的元素
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]);
}
}
- 测试代码
public class StackDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
stack stack1= new stack(3);
boolean loop = true;
String key = "";
Scanner scanner = new Scanner(System.in);
while(loop) {
System.out.println("show 显示栈中数据情况");
System.out.println("exit 退出栈");
System.out.println("push 将数据压入栈");
System.out.println("pop 将数据出栈");
System.out.println("请输入要执行的操作!");
key = scanner.next();
switch (key) {
case "show":
stack1.showStack();
break;
case "push":
System.out.println("请输入要压入栈的数据:");
int value = scanner.nextInt();
stack1.push(value);
break;
case "pop":
try {
int res = stack1.pop();
System.out.printf("出栈的数据是:%d\n", res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop = false;
break;
}
}
System.out.println("程序已退出!!!");
}
}
边栏推荐
猜你喜欢

算术表达式求值演示

The difference between big-endian and little-endian storage is easy to understand at a glance

ARMv8/ARMv9视频课程-Trustzone/TEE/安全视频课程

js在for循环中按照顺序响应请求

数理逻辑MOOC+知识点总结(未完无待续)

中国打造国产“谷歌地球”清晰度吓人

政务中心导航定位系统,让高效率办事成为可能

centos7 mysql异常ERROR 2002 (HY000)分析解决

【场景化解决方案】构建门店通讯录,“门店通”实现零售门店标准化运营

BUUCTF MISC brush notes (2)
随机推荐
mysql-5.5.40的完全卸载
The 5th Blue Cap Cup preliminary misc reappears after the game
jfinal加载配置文件原理
Where does detection go forward?
MySQL创建索引的技巧
Arduino+2片74hc595 驱动8x8(共阳)点阵(1008BS)
按字节方式和字符方式读取文件_加载配置文件
location.href用法
这下你知道为什么程序员要和产品干架了吧?
二叉树的遍历(非递归)
How does STM32 know the usage of FLASH
define 可变参数定义
【培训课程专用】CA/TA调用模型-代码导读
Redis基础
基于 JSch 实现服务的自定义监控解决方案
js在for循环中按照顺序响应请求
1. LVGL 8.3 在 Visual Studio 2019 模拟器中的环境搭建
医院智能3D蓝牙导航导诊系统
go Antlr重构脚本解释器如何实现
第1讲 Verilog基础知识