zoukankan      html  css  js  c++  java
  • 数据结构--栈

    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("
    当前出栈的元素为:" + 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("栈为满");
            }
            
        }
    }
    

      

  • 相关阅读:
    写代码的方法与思考
    改变文件上传input file类型的外观
    关于HTML Button点击自动刷新页面的问题解决
    使用 git push 出现error setting certificate verify locations问题记录
    flex使用学习
    jQuery.fn.extend()
    jQuery extend()
    作用域
    私有变量
    模仿块级作用域
  • 原文地址:https://www.cnblogs.com/fuhui-study-footprint/p/9087748.html
Copyright © 2011-2022 走看看