首页 > 编程语言 >【数据结构与算法 | 基础篇】数组模拟栈

【数据结构与算法 | 基础篇】数组模拟栈

时间:2024-05-25 19:29:21浏览次数:27  
标签:return top public Override 算法 数组 push 数据结构 stack

1. 前言

前文我们刚提及了如何用单向链表来模拟栈. 我们还可以用数组来模拟栈.使用栈顶指针top来进行栈顶的操作.

2. 数组模拟栈

(1). 栈接口

public interface stack<E> {
    //压栈
    boolean push(E value);
    //弹栈, 栈非空返回栈顶元素

    E pop();
    //返回栈顶元素, 但不弹栈
    E peek();
    //判断栈是否为空
    boolean isEmpty();
    //判断栈是否已满
    boolean isFull();
}

(2). 数组模拟栈

public class ArrayStack<E> implements stack<E>, Iterable<E>{
    //栈顶指针
    private int top;
    //数组模拟栈
    private E[] stack;

    public ArrayStack(int capacity) {
        stack = (E[]) new Object[capacity];
    }
    @Override
    public boolean push(E value) {
        if(isFull()) {
            return false;
        }
        stack[top++] = value;
        return true;
    }

    @Override
    public E pop() {
        if(isEmpty()) {
            return null;
        }
        return stack[--top];
    }

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        return stack[top-1];
    }

    @Override
    public boolean isEmpty() {
        return top < 0;
    }

    @Override
    public boolean isFull() {
        return top == stack.length;
    }
    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            @Override
            public boolean hasNext() {
                return top > 0;
            }

            @Override
            public E next() {
                return stack[--top];
            }
        };
    }
}

3. 单元测试

public class ArrayStackTest {
    @Test
    public void test1() {
        ArrayStack<Integer> stack = new ArrayStack<>(10);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(6);
        stack.push(7);
        for (Integer element : stack) {
            System.out.print(element + " ");
        }
        //7 6 5 4 3 2 1
    }
    @Test
    public void test2() {
        ArrayStack<Integer> stack = new ArrayStack<>(10);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(6);
        stack.push(7);
        System.out.println(stack.peek());
        //7
        System.out.println(stack.pop());
        //7
        System.out.println(stack.peek());
        //6
    }
}

标签:return,top,public,Override,算法,数组,push,数据结构,stack
From: https://blog.csdn.net/2301_80912559/article/details/139200430

相关文章

  • 复习数据结构的第五天(栈)
    上次我们复习了静态链表,它需要系统提前分配一定大小的内存空间,同时它和单链表一样有一个指针(游标)指向下一个节点的数组下标索引。它不具有顺序表随机访问的功能,但它可以像单链表一样插入删除时不需要移动其他元素,只需要改变游标就可以实现。栈的概念栈是一种只能在一端进行插......
  • c++实现简单算法【1】
    1.交换两数inta=2,b=3;inttemp=a;a=b;b=a; 函数包装指针#include<stdio.h>#include<string.h>//#include<iostream>//usingnamespacestd;voidswap(int*a,int*b){ inttemp=*a; *a=*b;//修改a指针指向的地址的对应的变量的值,地址不变 *b=temp;}int......
  • C语言数据结构栈的概念及结构、栈的实现、栈的初始化、销毁栈、入栈、出栈、检查是否
    文章目录前言栈的概念及结构栈的实现一、栈结构创建二、初始化结构三、销毁栈四、入栈五、出栈六、检查是否为空七、获取栈顶元素八、获取有效元素的个数九、测试1十、测试2总结前言C语言数据结构栈的概念及结构、栈的实现、栈的初始化、销毁栈、入栈、出栈、检......
  • 函数和数组的混合使用例子
    目录写两个函数,分别求两个数的最大公约数和最小公倍数写一个函数,使一个3x3的整形二维数组转置(行列转换)写一个函数打印杨辉三角扫雷游戏学习完了函数和数组,我们来进行简单的应用吧~写两个函数,分别求两个数的最大公约数和最小公倍数   一般我们求最大公约数可以使用......
  • 代码随想录算法训练营第十六天 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二
    104.二叉树的最大深度题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/文档讲解:https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE......
  • Redis基本数据结构
    String数据结构如果存储的是整型,直接把值存储在RedisObject里面,数据类型为int。如果存储的数据量不大(早期版本,32字节),采用动态字符串SDS存储,存储类型是embstr。超过32字节,采用动态字符串SDS进行存储,存储类型是raw。embstr和raw类型的区别在于,RedisObject和embstr是连续存......
  • 学习javascript的数组
    1.什么是数组?数组:(Array)是一种数据类型,属于引用数据类型。作用:在单个变量名下存储多个数据2.声明语法let数组名=[数据1,数据2......];注意事项:数组是按照顺序保存(是有序的),所以,每一个数据都有自己的编号。编号从0开始,数据的编号经常称为索引或下标。数组可以存储任意......
  • Java数据结构与算法(平衡二叉树)
    前言平衡二叉树是为了提高二叉树的查询速度,通过满足特定的条件来保持其平衡性。平衡二叉树具有以下特点:左子树和右子树的高度差不会大于1,这是为了确保树的高度不会过大,从而减少查询时的磁盘I/O开销,提高查询速度。平衡二叉树上的所有结点的平衡因子(左子树深度减去右子树深度的......
  • 【刷题笔记Day2】数组|977.有序数组的平方、209. 长度最小的子数组、59.螺旋矩阵II
    文章目录977.有序数组的平方解题思路遇到的问题及解决方案209.长度最小的子数组解题思路遇到的问题及解决方案59.螺旋矩阵II解题思路遇到的问题及解决方案总结977.有序数组的平方题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新......
  • 代码随想录算法训练营第36期DAY38
    DAY38435无重叠区间昨晚很快就想出来了,今天相当于二刷。class Solution {public:    static bool mycmp(vector<int>&a,vector<int>&b){        return a[1]<b[1];    }    int eraseOverlapIntervals(vector<vector<int>>& intervals) {   ......