数据结构--栈

1、什么是栈?
在古代栈是牲口棚的意思,在计算机中栈是一种机制
栈机制:后进先出(LIFO:last in first out)

栈要素:栈底 和 栈顶,先入栈的为 栈底 和后入栈的为 栈顶 ;

创建栈:初始化栈空间,给定一个栈的容量,即栈顶
删除栈:回收栈空间内存
判断栈是否为空:根据栈中已有元素的个数,判断栈是否为空,为空返回true,不为空返回false
判断栈是否已满:根据 栈的容量当前栈的长度 判断栈是否已经满员,为满返回true,不满返回false
清空栈元素:直接将栈顶置为0,
获取栈长度:因为栈顶会随着栈的长度改变而改变所以,可以直接使用栈顶获取栈的长度  
入栈:首先对栈进行判满,然后将入参赋值给处于栈顶的那个元素(因为栈顶所指向的内存是一直为空的,所以可以直接赋值给栈顶),之后栈顶自增
出栈:首先对栈进行判空,然后将栈顶自减。

注:此处的出栈其实并不是删除元素所在内存,只是栈的最后一个元素(栈的长度)不再指向那个元素,当再次添加元素的时候会覆盖掉之前出栈的元素

如果要返回入出栈的值,又不用入参,可以使用object类型,然后如果栈是空的,则进行throw操作,抛出异常,不过在调用的时候就要用try{}cache{}进行捕获异常了
遍历栈元素:可从栈底向栈顶遍历,也可从栈顶向栈底遍历,

下方为创建栈结构的代码:

package util;

public class MyStack {

    // 栈的容量大小
    private int myStackSize;
    // 栈顶,即栈的长度
    private int myStackTop;
    // 栈本身
    public Object[] myStack;

    public MyStack() {
        super();
    }

    /**
     * 初始化栈空间
     * @param size 栈的 容量大小
     */
    public MyStack(int size)
    {
        myStackSize = size;
        // 申请内存
        myStack = new Object[size];
        myStackTop = 0;
    }
    
    public void delStack()
    {
        myStack = null;
    }

    /**
     * 栈是否为空
     * @return
     */
    public boolean isNullStack()
    {
        return 0 == myStackTop ? true : false;
    }

    /**
     * 栈是否为满
     * @return
     */
    public boolean isFullStack()
    {
        return myStackSize == myStackTop ? true : false;
    }

    /**
     * 清空栈
     */
    public void clearStack()
    {
        myStackTop = 0;
    }

    /**
     * 返回栈长度
     * @return
     */
    public int stackLen()
    {
        return myStackTop;
    }

    /**
     * 元素入栈
     * @param element
     * @return
     */
    public boolean push(Object element){
        if (isFullStack())
        {
            return false;
        }
        else
        {
            myStack[myStackTop] = element;
            myStackTop ++;
            return true;
        }
    }

    /**
     * 出栈
     * @return 返回出栈的元素
     * @throws Exception
     */
    public Object pop() throws Exception
    {
        if (isNullStack())
        {
            throw new Exception("栈为空,无法删除元素");
        }
        else
        {
            myStackTop --;
            return myStack[myStackTop];
        }
    }

    /**
     * 遍历栈
     * @param isFromButtom 为真 顺序遍历,为假倒序遍历
     */
    public void StackTraverse(boolean isFromButtom)
    {
        if (isFromButtom)
        {
            for (int i = 0; i < myStackTop; i++)
            {
                System.out.println(myStack[i].toString());
            }
        }
        else
        {
            for (int i = myStackTop - 1; i >= 0; i--)
            {
                System.out.println(myStack[i].toString());
            }
        }
    }
}

  

下方是测试上方的代码:

package use.test;

import test.entity.Person;
import util.MyStack;

public class TestMyStack {
    public static void main(String[] args) {
        MyStack myStack = new MyStack(3);
        
        Person person1 = new Person();
        person1.setAddress("合肥市蜀山区");
        person1.setName("张三");
        person1.setAge(22);
        
        Person person2 = new Person();
        person2.setAddress("南京市江宁区");
        person2.setName("李四");
        person2.setAge(44);
        
        //入栈
        myStack.push(person1);//栈底
        myStack.push(person2);
        
        myStack.push(1);//栈顶
        
        System.out.println("栈的长度为:" + myStack.stackLen());
        myStack.StackTraverse(true);
        
        //出栈
        try {
            Object element = myStack.pop();
            System.out.println("\n当前出栈的元素为:" + element);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("栈的长度为:" + myStack.stackLen());
        myStack.StackTraverse(false);
        
        //清空栈
//        myStack.clearStack();
        if (myStack.isNullStack())
        {
            System.out.println("栈为空");
        }
        
        if (myStack.isFullStack())
        {
            System.out.println("栈为满");
        }
        
    }
}

  

猜你喜欢

转载自www.cnblogs.com/fuhui-study-footprint/p/9087748.html