最粗暴的方法实现一个栈

简介: 最粗暴的方法实现一个栈

对于栈和队列是一个很简单的知识,用的感觉也不是很多,但是,我们仍然的学习!!加油!!在实现最简单的栈之前,我们需要简单了解一下栈是什么??

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、 入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 原文链接为: https://baike.baidu.com/item/%E6%A0%88/12808149?fr=aladdin

栈stack是以“先进后出”模式入栈,出栈的!比如:子弹的弹夹

对于数据12,23,34,45,56,我们进行入栈和出栈的简单描述为:

注意:如果我们想在上述的数据中,拿到12,则需要将12上面的全部数据都拿走,否则是拿不走12的!!先进后出模式!

另一种用法:如果你要存储的数据支持先进后出模式,则就需要用到栈stack这种数据结构!

下面我们就栈的几个基础的:入栈,压栈,得到栈顶元素(偷看),来进行讲解一下基础的语法!!

import java.util.Stack;
public class Tset {
    public static void main(String[] args) {
        Stack<Integer> stack =new Stack<>();
        //入栈
        stack.push(12);
        stack.push(23);
        stack.push(34);
        stack.push(45);
        System.out.println("获取此时栈中的元素个数:"+stack.size());
        //出栈
        System.out.println("出栈");
        Integer a=stack.pop();
        System.out.println(a);
        Integer b=stack.pop();
        System.out.println(b);
        System.out.println("获取此时栈中的元素个数:"+stack.size());
        //获取栈顶元素(偷看)
        System.out.println("获取栈顶元素(偷看)");
        Integer c=stack.peek();
        System.out.println(c);
        Integer d=stack.peek();
        System.out.println(d);
        System.out.println("获取此时栈中的元素个数:"+stack.size());
    }
}

上述代码的运行结果为:

对于该入栈时候的顺序为:12,23,34,45

经过上述的铺垫,那么,我们就深入研究一下;模拟实现一个栈吧!!以数组的形式实现一个栈!!

实现一个栈的准备阶段:必须定义一个栈:

public class MyStack {
    public int[] elem;
    public int usedSize;
    public MyStack(){
        //构造方法,定义数组的长度为10
        this.elem=new int[10];
    }  
}

有了上述的代码,那么我们就可以进行:压栈!!

压栈,(放入数据)
//压栈(放入数据)
    public void push(int val){
        if (isFull()){
            //判断是否满了!
            //扩容
            elem= Arrays.copyOf(elem,2*elem.length);
        }
        elem[usedSize]=val;
        usedSize++;
    }
    public boolean isFull(){
        return usedSize== elem.length;
    }

首先先对需要放入到数据判断是否需要扩容处理!在上述的代码中,进行了2倍扩容!其实要想放入数据,这个代码很简单!!

出栈(获取栈顶元素)
//出栈(将栈顶的元素出栈并返回)
    public int pop(){
        if(isEmpty()){
            throw new EmptyException("栈是空的!");
         //自定义异常
        }
        int val=elem[usedSize-1];
        usedSize--;
        return val;
    }
    public boolean isEmpty(){
        return usedSize==0;
    }

对于该段代码,实际上并没有删除元素,但是通过usedSize-1,或者通过usedSize--,不再记录该栈顶元素,所以可以理解为删除了

获取栈顶元素(偷看)
//获取栈顶元素(偷看)
    public int peek(){
        if (isEmpty()){
            throw new EmptyException("栈是空的!");
        }
        return elem[usedSize-1];
    }

切记,在最后返回的时候,千万不能使用usedSize--,原因在于:peek是模仿的偷看!!如果使用usedSize--就会使得usedSize的数据发生改变!!

抛异常的代码:

public class EmptyException extends RuntimeException {
    public EmptyException() {
    }
    public EmptyException(String message) {
        super(message);
    }
}

抛异常的代码:也就简简单单的两个构造方法!!

测试用列:

public class Test {
    public static void main(String[] args){
        MyStack stack =new MyStack();
        //压栈(放入数据)
        stack.push(12);
        stack.push(23);
        stack.push(34);
        stack.push(45);
        //出栈
        Integer a=stack.pop();
        System.out.println(a);//45
        //此时栈中还有,12,23,34
        Integer b=stack.pop();
        System.out.println(b);
        //此时栈中还有,12,23
        System.out.println(stack.isEmpty());
    }
}

上述便是全部的代码!!到目前位置,我们遍实现了一个栈!!简单而又粗暴!!

注意区分:进栈过程可以出栈(边进边出)考试常见!!

相关文章
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
241 9
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
124 4
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
40 1
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
71 5
|
2月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
2月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
2月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
54 4
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
53 0
|
3月前
数据结构(栈与列队)
数据结构(栈与列队)
25 1