zoukankan      html  css  js  c++  java
  • 为什么栈的实现很多人写不出来

    一 前言

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

    二 栈的实现

    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
    
  • 相关阅读:
    C++ 从文件中读取数据的代码及优化
    EOF在C++中的含义
    利用"中值滤波原理"过滤异常数据(转载)
    Hive差集运算详解
    H5 玩出新花样(一) -- 森林领导术不倒流
    C++中怎么暂停几秒
    c语言中 srand(time(NULL)); 这句话是什么意思(尤其是 NULL)
    C++ 码代码的风格(推荐)
    c/c++编译器的安装
    jquery的$(selector).each,$.each的区别
  • 原文地址:https://www.cnblogs.com/zszxz/p/12536831.html
Copyright © 2011-2022 走看看