数据结构“栈”-诺禾

1、前言
栈是一个种线性结构,非常重要。遵循“先入后出”的有序列表栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入、删除的一端,为变化的一端,称为栈顶(Top),另一端为固定一端,称为栈底(Bottom)。

2、栈应用场景
1)子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。2)处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。3)表达式的转换[中缀表达式转后缀表达式]与求值。4)二叉树的遍历5)图形的深度优先(depth-first)搜索法

3、实现栈的思路分析
1)这里我们使用数组类模拟栈
2)定义一个top来表示栈顶,初始化为-1
3)入栈的操作,当有数据打入到栈时,top++;stack[top]=data;
4)出栈的操作,intvalue=stack[top];top–,return value
4、栈堆抽象类型定义及基本操作
基本操作:
(1)getSize():获取栈的元素个数
如何获取栈元素个数,大家都知道栈当top=0时,栈存在一个元素,那么获取栈元素个数就直接返回top即可获取
(2)isEmpty():判断栈是否为空
栈如何为空,若存储栈的长度为stackSize,那么栈的顶位置top必须小于stackSize的范围内,通常把控栈判定条件定位top等于-1即可。
(3)isFull():判断栈是否已满
判断栈是否满,很简单只要判断top如果大于等于stackSize-1即可(因为数组下标是从0开始的)
(4)push():压栈/入栈
(5)pop():弹栈/出栈
(6)peek():返回栈顶元素
(7)list():显示栈/遍历栈

4、代码实现(栈顺序存储)
1)编写一个interface类,代码如下
public interface StackInterFace {int getSize();boolean isEmpty();void push(Object value);Object pop();Object peek();}
2)编写ArrayStackImp实现StackInterFace接口
public class ArrayStackImp implements StackInterFace{private Object[] elements;//定义一个数组保存堆栈的元素private static final int DEFAULT_CAPACITY = 16;//设置堆栈默认容量private int top;//栈顶指针//有参构造器public ArrayStackImp(int initialCapacity) {elements = new Object[initialCapacity];}//入栈@Overridepublic void push(Object value) {//判断是否栈已经满if (top >= elements.length){//如果栈指针>=elements.length时,说明栈已满//满了需要扩容,且将旧的数组复制到新的数组Object[] newElements = new Object[elements.length * 2];for (int i = 0; i <elements.length; i++){newElements[i] = elements[i];}elements = newElements;}elements[top] = value;top++;}//出栈public Object pop() {if (top <= 0){System.out.println(“栈为空”);throw new RuntimeException(“栈空”);}//否则Object value = elements[top];//从栈顶取元素top–;return value;}

猜你喜欢

转载自blog.csdn.net/yyone123/article/details/107793561