• 为什么栈的实现很多人写不出来


    一 前言

    本篇使用数组的方式实现栈,当然重点不在使用了什么样的数据结构去实现另一种数据结构,也可以使用动态数组,链表来实现栈;知识追寻者觉得比较重要的是实现一种数据结构的思路;比如栈,只要知道了如何去实现栈的思路,后面不就是敲敲几行代码的事情么,反之三思后行古人早就教给我们了;当然本文只提供一种简单的实现方式,肯定有许多不足之处;

    二 栈的实现

    2.1栈的含义

    • 栈是一种有序的线性表,只能在一端插入数据和删除数据,最后插入的数据也就是最先被删除的数据;通常栈也被称为先进后出或者后进先出的线性表结构;
    • 栈的定义看起来对初学者可能有点模糊,读者可以想象一下工厂里面的玻璃,一块一块玻璃从地面开始叠的高高的,取得时候是从最高层得一块玻璃往下取;
    • 看下面一张经典得栈结构图,中间是原本得栈大小为3,栈顶的数值为3;如果往栈顶加入一个数值4,就会变为左边的图,此时栈顶为4,栈大小为4;如果中间栈的删除一个元素,就会变为右边的图,此时栈顶值为2,栈大小为2;

    2.2 栈的重要数据类型

    通过前面说明介绍可以详细的认识到使用栈避不开,栈的栈顶值(top),栈的添加操作(push),栈的删除操作(pop),栈的当前大小(size);通常每种数据结构都有一个初始容量值(capacity),当栈的当前大小超出容量值,也就是溢栈,也就是很多文章里面很多提到的 stack overflow;

    2.3 数组实现方式

    • 入栈push实现思路; 栈顶索引 + 1;
    • 出栈pop实现思路;栈顶索引-1;
    • 栈顶值peek就是栈顶索引;
    /**
     * @Author lsc
     * <p>数组栈实现 </p>
     */
    public class ArrayStack {
    
        // 容量
        private int capacity;
        // 数组栈
        private long[] stackArray;
        // 栈顶
        private int top;
        // 构造
        public ArrayStack(int size) {
            // 设置容量大小
            capacity = size;
            // 创建数组
            stackArray = new long[capacity];
            // 栈顶初始值为 -1 表示空栈
            top = -1;
        }
        // 入栈
        public void push(long data) {
            // 索引加1
            stackArray[++top] = data;
        }
        // 出栈
        public long pop() {
            // 索引减1
            return stackArray[top--];
        }
        // 栈顶值
        public long peek() {
            return stackArray[top];
        }
        // 判定是否是空栈
        public boolean isEmpty() {
            return (top == -1);
        }
        // 判定栈是否已满
        public boolean isFull() {
            return (top == capacity - 1);
        }
    
    }
    

    测试

    public static void main(String[] args) {
            ArrayStack arrayStack = new ArrayStack(6);
            arrayStack.push(1);
            arrayStack.push(2);
            System.out.println(arrayStack.pop());
            System.out.println(arrayStack.peek());
            System.out.println(arrayStack.isEmpty());
            System.out.println(arrayStack.isFull());
        }
    

    输出

    2
    1
    false
    false
    
  • 相关阅读:
    mysql int类型 int(11) 和int(2)区别
    mysql 用户 登陆 权限相关
    【转】ext4+delalloc造成单次写延迟增加的分析
    write 系统调用耗时长的原因
    【转】通过blktrace, debugfs分析磁盘IO
    win7 wifi热点
    【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap
    pdflush进程介绍与优化【转】
    How to find per-process I/O statistics on Linux
    oom_killer
  • 原文地址:https://www.cnblogs.com/zszxz/p/12536831.html
Copyright © 2020-2023  润新知