
1.概念
1.1栈
- 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除操作。
- 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底
- 栈中的元素遵循先进后出原则FILO(First In Last Out)。
1.2 进栈push
栈的插入操作称为进栈/压栈,数据在栈顶
如下图所示:

1.3 出栈 pop
栈的删除操作称为出栈
如下图所示:

1.4 注意区分此处的栈和JVM中的栈
- 此处的栈是一种数据结构
- JVM中的栈特指JVM中一端内存区域
2.栈的使用
2.1 Java标准库中提供的栈

可以看到,Stack继承了Vector。


2.1 实现的方法

下面详细介绍一下实现的方法含义:
| Stack() | 构造一个空的栈 |
|---|---|
| E push(E) | 将e入栈,并返回e |
| E pop() | 将栈顶元素出栈并返回 |
| E peek() | 获取栈顶元素 |
| int size() | 获取栈中有效元素个数(继承自Vector) |
| boolean empty() | 检查栈是否为空 |
java代码实现
public class stackTest {
public static void main(String[] args) {
Stack<Integer> stack=new Stack<>();
//入栈
stack.push(1);
stack.push(2);
stack.push(23);
stack.push(65);
stack.push(52);
//获取栈顶元素
System.out.println("栈顶元素:"+stack.peek());
//获取栈中有效元素个数
System.out.println("栈中有效元素个数:"+stack.size());
//出栈
stack.pop();
//获取栈顶元素
System.out.println("栈顶元素:"+stack.peek());
//获取栈中有效元素个数
System.out.println("栈中有效元素个数:"+stack.size());
//检查栈是否为空
System.out.println("栈是否为空:"+stack.empty());//false
for (int i=0;i<=3;i++){
stack.pop();
}
System.out.println("栈是否为空:"+stack.empty());//true
stack.pop();//报错
}
}
运行结果:
可以注意到,当栈为空时,再进行出栈操作时,会报错:EmptyStackException
3.模拟实现栈
栈是特殊的顺序表,可以用链表和数组的方式来实现,但是一般采用数组来实现
public class MyStack {
/** 构造方法*/
private int[] arr;
//记录栈中元素个数
private int size;
public MyStack(int MaxSize) {
this.arr = new int[MaxSize];
}
//无参构造函数,默认最大容量12
public MyStack() {
this(12);
}
/** 入栈 */
public int push(int value){
//栈满,需要扩容 扩容至原来的2倍
if (this.size==arr.length){
int[] copyArr;
copyArr= Arrays.copyOf(arr,arr.length*2);
arr=copyArr;
}
//栈未满
//将元素添加到size位置
this.arr[size]=value;
//元素个数+1
this.size=this.size+1;
return value;
}
/** 判断元素是否为空 */
public boolean isEmpty(){
return this.size==0;
}
/** 出栈 */
public int pop(){
//栈空
if(isEmpty()){
//没有元素 抛出异常
throw new RuntimeException("栈为空,不能出栈操作。。。");
}
//栈不为空
//获取栈顶元素
int value=this.arr[size-1];
this.size--;
return value;
}
/** 获取栈顶元素 */
public int peek(){
//栈空
if(isEmpty()) {
//没有元素 抛出异常
throw new RuntimeException("栈为空,不能出栈操作。。。");
}
return this.arr[this.size-1];
}
/** 获取元素个数 */
public int getSize(){
return this.size;
}
}
参考文章:

1366

被折叠的 条评论
为什么被折叠?



