嘻嘻,今天博主终于要更新栈的知识了,上次结束说要更新要是上一次,所以这次咱就把栈的实现的更新带来了,嗯~ o(* ̄▽ ̄*)o小伙伴可能会问,栈能干什么啊,在Java中栈不是有对应的类吗....
栈能够实现逆波兰计算机,中缀表达式转后缀表达式,还有普通中缀计算机等.....
话不多说,我们就从一下几个方面开始吧
栈的概念 栈的实现思路 栈的代码实现与分析 结论
如果喜欢作者的话,戳这
往期精彩:
普通队列与环形队列
栈的概念:
- 栈是一个先进后出,后进先出的有序列表 在栈中添加元素和删除元素都在一端执行,是一个特殊的线性表 插入元素或删除元素的一端是活跃的一端,被称为栈顶 另一端不活跃,被称为栈底 常用术语:压栈=入栈=push 出栈=弹栈=pop
栈的实现思路:
我们需要创建一个数组去模拟栈 定义一个栈顶变量top,用于指向栈顶 定义压栈弹栈等方法
栈的代码实现与分析:
创建一个数组及其变量模拟栈
private int maxSize;
private int top;
private Object[] stack;
public ArraysStack(int maxSize) {
this.maxSize = maxSize;
this.top = -1;
stack = new Object[maxSize];
}
代码分析:
maxSize是栈的最大容量,在调用构造方法的时候可以自行指定 top用于指向栈顶的变量,应该被初始化为-1 这里选用了Object[]数组,目的是什么都可以放进去
图解:
创造两个方法,分别判断是否已满或已空
public boolean isFull() {
return top == maxSize - 1;
}
public boolean isEmpty() {
return top == -1;
}
代码分析:
图解:
创建一个压栈和弹栈的方法
public void push(E element) {
if(isFull()) {
System.out.println("栈已满,无法压栈");
return;
}
stack[++top] = element;
}
public E pop() throws Exception{
if(isEmpty()) {
throw new Exception("栈已空,无法弹栈");
}
return (E)stack[top--];
}
代码分析:
加入元素和取出元素之前,要分别分析一下栈是否为空,或是否为满,要有校验意识因为top初始化为-1,所以添加元素的时候应该先要自增,再添加因为top指向栈顶元素,所以取出元素时,先取出,栈顶top变量再自减
图解:
创建一个遍历的方法
public void print() {
if(isEmpty()){
System.out.println("栈已空,无法输出");
return;
}
for (int i = top; i >= 0; i--) {
System.out.println("stack[" + i + "] = " + stack[i]);
}
}
代码分析:
- 从栈的定义得知,先拿出来的是栈顶元素,所以应该从top开始,到0结束
package datastructure.chapter02.stack.instance; public class ArraysStack结论:{ private int maxSize; private int top; private Object[] stack; public ArraysStack(int maxSize) { this.maxSize = maxSize; this.top = -1; stack = new Object[maxSize]; } public boolean isFull() { return top == maxSize - 1; } public boolean isEmpty() { return top == -1; } public void push(E element) { if(isFull()) { System.out.println("栈已满,无法压栈"); return; } stack[++top] = element; } public E pop() throws Exception{ if(isEmpty()) { throw new Exception("栈已空,无法弹栈"); } return (E)stack[top--]; } public void print() { if(isEmpty()){ System.out.println("栈已空,无法输出"); return; } for (int i = top; i >= 0; i--) { System.out.println("stack[" + i + "] = " + stack[i]); } } }
栈的知识点简单又重要,代码不多,理解起来也不难,我来总结一下重要的几点:
栈顶top的初始化赋值
栈的压栈和弹栈的方法
下一站:双向链表!!!



