栈的两种实现方式

本文介绍了两种栈的数据结构实现方法:一种是使用数组作为底层结构的顺序栈;另一种是使用链表实现的链表栈。文章详细解释了这两种实现方式的具体操作,包括压栈、弹栈、查看栈顶元素等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.顺序栈的实现:

package com.zrgk.io;


public class StackArray {
//顺序结构的栈
//底层是数组
//定义初始的容量
private int len = 10;
//定义底层的数组
private Object[] arr;
//定义存储到的标志位坐标
private int top;
public StackArray(){
//当栈内没有元素的时候,显示为-1
top = -1;
arr = new Object[len];
}
//返回实际增加了元素的个数,
public int getSize(){
return top+1;
}
//压入栈顶
public void push(Object obj){
if (getSize() >= arr.length) {
Object[] arr1 = new Object[len+10];
for (int i = 0; i < arr.length; i++) {
arr1[i] = arr[i];
}
arr = arr1;
}
arr[++top] = obj;
}
//取出栈顶元素,并从栈中去除
public Object pop(){
if (getSize() < 1) {
try {
throw new Exception("该栈中没有元素");
} catch (Exception e) {
e.printStackTrace();
}
}
//取出栈顶元素,也就是取出数组索引最大的那个的元素,也就是top值最大的那个元素,然后将top值位上
//的值为null。top减一
Object obj = arr[top];
arr[top--] = null;
return obj;
}
//从栈顶取出元素,但是不去除元素
public Object peek(){
if (getSize() < 1) {
try {
throw new Exception("该栈中没有元素");
} catch (Exception e) {
e.printStackTrace();
}
}
Object obj = arr[top];
return obj;
}
//判断栈是否为空
public boolean isEmpty(){
if (top < 0) {
return true;
}
return false;
}

}



2.链表式的实现方式:


package com.zrgk.io;


public class StackLinked<T> {
//链表结构的栈
//需要通过一个内部类的对象来实际封装栈中的数据
private class Node<U>{
//存储实际内容的变量
public U element;
//存储节点之间信息和内容
public Node next;
//通过无参的构造来初始化各变量
public Node(){
element = null;
next = null;
}
//需要一个能够直接存储数据的构造函数
public Node(U element, Node<U> next){
this.element = element;
this.next = next;
}

//需要一个方法来判断是否到了栈低
//当到达栈低的时候,两个变量的值就像初始化的时候一样,是null值
public boolean end(){
return element == null && next == null;
}
}
//建立一个基本的节点,里面没有任何东西,来标志栈低
private  Node<T> top = new Node<T>();
//压进栈顶
public void push(T obj){
//这里要理解将原来的空top装进新的node对象中,实际上就是将 其作为了栈低的标志
//每次push元素的时候,就新建一个node对象,将原有的node对象封装进去
//就这样一层一层的套,形成了栈结构,最新添加的元素总是在最外围,因此总是能够最先被取出来
top = new Node<T>(obj,top);
}
//从栈顶取出元素,并将元素清除
public T pop(){
//从top中取出元素
//要先判断栈中是否还有元素
boolean end = top.end();
if (end) {
try {
throw new Exception("该栈没有元素");
} catch (Exception e) {
e.printStackTrace();
}
}
T element = top.element;
//清除数据其实就让top引用指向封装的里面的node对象
top = top.next;
return element;
}
//从栈顶取出对象,但是不删除该对象
public T peek(){
boolean end = top.end();
if (end) {
try {
throw new Exception("该栈没有元素");
} catch (Exception e) {
e.printStackTrace();
}
}
T element = top.element;
return element;
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值