Java教程

Java 堆栈

堆栈是一种线性数据结构,用于存储对象的集合。它基于先进先出(LIFO)。 Java集合框架提供了许多接口和类来存储对象的集合。其中之一是 Stack类,它提供了不同的操作,例如推,弹出,搜索等。
在本节中,我们将讨论 Java Stack类,其方法实现在 Java中的堆栈数据结构程序。但是在转到Java Stack类之前,请先快速了解堆栈的工作原理。
堆栈数据结构具有两个最重要的操作,分别是 push pop 。推操作将元素插入堆栈,弹出操作将元素从堆栈顶部移除。让我们看看它们如何在堆栈上工作。
Java Stack
让我们推20,13,89,90,
Java Stack
让我们删除(弹出)18, 45和11。
Java Stack
空堆栈: 如果堆栈中没有元素,则称为空堆栈。当堆栈为空时,顶部变量的值为-1。
Java Stack
当我们按下堆栈中的元素顶部增加了1 。在下图中,
推12,前= 0 按6,top = 1 推9,top = 2 Java堆栈
当我们从堆栈中弹出一个元素时,top的值被减小了1 。在下图中,我们弹出了9。
Java Stack
下表显示了不同的值
Java Stack

Java Stack类

在Java中, Stack 是属于Collection框架的类,该类扩展了 Vector 类。它还实现了列表,集合,可迭代,可克隆,可序列化的接口。它表示对象的LIFO堆栈。在使用Stack类之前,我们必须导入 java.util 包。堆栈类按Collections框架层次结构排列,如下所示。
Java Stack

Stack类构造器

Stack类仅包含创建空堆栈的默认构造器
public Stack()

创建堆栈

如果要创建堆栈,请首先导入 java.util 包并创建一个Stack类的对象。
Stack stk = new Stack();
Stack<type> stk = new Stack<>();
其中的类型表示堆栈的类型,例如整数,字符串等。

堆栈类的方法

我们可以执行push,pop,peek并在堆栈上进行搜索操作。 Java Stack类主要提供五种方法来执行这些操作。除此之外,它还提供了 Java Vector类的所有方法。
方法 修饰符和类型 方法说明
empty() boolean 该方法检查堆栈是否为空。
push(E item) E 该方法将一个元素压入(插入)堆栈的顶部。
pop() E 该方法从堆栈顶部删除一个元素,并返回与该函数的值相同的元素。
peek() E 该方法在不删除堆栈的情况下查看堆栈的顶部元素。
search(Object o) int 该方法搜索指定的对象并返回该对象的位置。

堆栈类empty()方法

Stack类的 empty()方法检查堆栈是否为空与否。如果堆栈为空,则返回true,否则返回false。我们还可以使用Vector类的 isEmpty()方法。
语法
public boolean empty()
返回: : 如果堆栈为空,则该方法返回true,否则返回false。
在以下示例中,我们创建了Stack类的实例。之后,我们两次调用了empty()方法。第一次返回 true ,因为我们没有将任何元素压入堆栈。之后,我们将元素推入堆栈。再次,我们调用了empty()方法,该方法返回 false ,因为堆栈不为空。
StackEmptyMethodExample.java
import java.util.Stack;
public class StackEmptyMethodExample
{
    public static void main(String[] args)
{
        Stack<Integer>stk= new Stack<>();
        boolean result = stk.empty();
        System.out.println("Is the stack empty? " + result);
        stk.push(78);
        stk.push(113);
        stk.push(90);
        stk.push(120);
        System.out.println("Elements in Stack: " + stk);
        result = stk.empty();
        System.out.println("Is the stack empty? " + result);
    }
}
输出:
Is the stack empty? true
Elements in Stack: [78, 113, 90, 120]
Is the stack empty? false

堆栈类push()方法

该方法将一项插入到堆栈顶部。它的作用与Vector类的 addElement(item)方法相同。它传递参数 item 并将其压入堆栈。
语法
public E push(E item)
参数: 要推入堆栈顶部的项目。
返回值: 该方法返回已传递的参数

堆栈类pop()方法

该方法删除堆栈顶部的一个对象并返回相同的对象。如果堆栈为空,则会抛出 EmptyStackException
语法
public E pop()
返回: : 它返回位于堆栈顶部的对象。
让我们在Java程序中实现堆栈并执行推入和弹出操作。
StackPushPopExample.java
import java.util.*;
public class StackPushPopExample
{
    public static void main(String args[])
{
        Stack <Integer> stk = new Stack<>();
        System.out.println("stack: " + stk);
        pushelmnt(stk, 20);
        pushelmnt(stk, 13);
        pushelmnt(stk, 89);
        pushelmnt(stk, 90);
        pushelmnt(stk, 11);
        pushelmnt(stk, 45);
        pushelmnt(stk, 18);
        popelmnt(stk);
        popelmnt(stk);
        try
{
            popelmnt(stk);
        }
        catch (EmptyStackException e)
{
            System.out.println("empty stack");
        }
    }
    static void pushelmnt(Stack stk, int x)
{
        stk.push(new Integer(x));
        System.out.println("push -> " + x);
        System.out.println("stack: " + stk);
    }
    static void popelmnt(Stack stk)
{
        System.out.print("pop -> ");
        Integer x = (Integer) stk.pop();
        System.out.println(x);
        System.out.println("stack: " + stk);
    }
}
输出:
stack: []
push ->
20
stack: [20]
push ->
13
stack: [20, 13]
push ->
89
stack: [20, 13, 89]
push ->
90
stack: [20, 13, 89, 90]
push ->
11
stack: [20, 13, 89, 90, 11]
push ->
45
stack: [20, 13, 89, 90, 11, 45]
push ->
18
stack: [20, 13, 89, 90, 11, 45, 18]
pop ->
18
stack: [20, 13, 89, 90, 11, 45]
pop ->
45
stack: [20, 13, 89, 90, 11]
pop ->
11
stack: [20, 13, 89, 90]

堆栈类peek()方法

它查看堆栈顶部的元素。如果堆栈为空,它还会引发 EmptyStackException
语法
public E peek()
返回: 它返回堆栈的顶部元素。
让我们看一下peek()方法的示例。
StackPeekMethodExample.java
import java.util.Stack;
public class StackPeekMethodExample
{
    public static void main(String[] args)
{
        Stack<String> stk= new Stack<>();
        stk.push("Apple");
        stk.push("Grapes");
        stk.push("Mango");
        stk.push("Orange");
        System.out.println("Stack: " + stk);
        String fruits = stk.peek();
        System.out.println("Element at top: " + fruits);
    }
}
输出:
Stack: [Apple, Grapes, Mango, Orange]
Element at the top of the stack: Orange
该方法从顶部开始搜索堆栈中的对象。它解析我们要搜索的参数。它返回对象在堆栈中从1开始的位置。堆栈最顶部的对象被视为距离1。
假设,o是我们要搜索的堆栈中的对象。该方法返回距堆栈顶部最近的堆栈顶部的距离。它使用 equals()方法搜索堆栈中的对象。
语法
public int search(Object o)
参数: o是要搜索的所需对象。
返回: 它从堆栈顶部返回对象位置。如果返回-1,则表示该对象不在堆栈上。
让我们看一下search()方法的示例。
StackSearchMethodExample.java
import java.util.Stack;
public class StackSearchMethodExample
{
    public static void main(String[] args)
{
        Stack<String> stk= new Stack<>();
        stk.push("Mac Book");
        stk.push("HP");
        stk.push("DELL");
        stk.push("Asus");
        System.out.println("Stack: " + stk);
        int location = stk.search("HP");
        System.out.println("Location of Dell: " + location);
    }
}

Java堆栈操作

堆栈大小

我们还可以使用 size()方法。它返回堆栈中元素的总数(堆栈的大小)。
语法
public int size()
让我们看一下Vector类的size()方法的示例。
StackSizeExample.java
import java.util.Stack;
public class StackSizeExample
{
    public static void main (String[] args)
{
        Stack stk = new Stack();
        stk.push(22);
        stk.push(33);
        stk.push(44);
        stk.push(55);
        stk.push(66);
        boolean rslt=stk.empty();
        System.out.println("Is the stack empty or not? " +rslt);
        int x=stk.size();
        System.out.println("The stack size is: "+x);
    }
}
输出:
Is the stack empty or not? false
The stack size is: 5

迭代元素

迭代意味着获取堆栈中的元素。我们可以使用以下三种不同的方法来获取堆栈的元素:
使用 iterator()方法 使用 forEach()方法 使用 listIterator()方法

使用iterator()方法

这是Iterator接口的方法。它在堆栈中的元素上返回一个迭代器。在使用iterator()方法之前,请导入 java.util.Iterator 包。
语法
Iterator<
T>
iterator()
让我们在堆栈上执行迭代。
StackIterationExample1.java
import java.util.Iterator;
import java.util.Stack;
public class StackIterationExample1
{
    public static void main (String[] args)
{
        Stack stk = new Stack();
        stk.push("BMW");
        stk.push("Audi");
        stk.push("Ferrari");
        stk.push("Bugatti");
        stk.push("Jaguar");
        Iterator iterator = stk.iterator();
        while(iterator.hasNext()){
            Object values = iterator.next();
            System.out.println(values);
        }
    }
}
输出:
BMW
Audi
Ferrari
Bugatti
Jaguar

使用forEach()方法

Java提供了一个forEach()方法来迭代元素。该方法在 Iterable Stream 接口中定义。
语法
default void forEach(Consumer<super T>action)
让我们使用forEach()方法遍历堆栈。
StackIterationExample2.java
import java.util.*;
public class StackIterationExample2
{
    public static void main (String[] args)
{
        Stack <Integer>stk = new Stack<>();
        stk.push(119);
        stk.push(203);
        stk.push(988);
        System.out.println("Iteration over the stack using forEach() Method:");
        stk.forEach(n ->
{
        System.out.println(n);
}
        );
    }
}
输出:
Iteration over the stack using forEach() Method:
119
203
988

使用listIterator()方法

此方法从列表中的指定位置开始(按顺序)返回所提到列表中元素的列表迭代器。从t迭代堆栈
语法
ListIterator listIterator(int index)
参数: 该方法解析名为 index的参数。
返回: 此方法返回列表迭代器。
异常: : 如果索引超出范围,它将抛出 IndexOutOfBoundsException
让我们迭代
StackIterationExample3.java
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Stack;
public class StackIterationExample3{
    public static void main (String[] args){
        Stack <Integer>stk = new Stack<>();
        stk.push(119);
        stk.push(203);
        stk.push(988);
        ListIterator<Integer> ListIterator = stk.listIterator(stk.size());
        System.out.println("Iteration over the Stack from top to bottom:");
        while (ListIterator.hasPrevious()){
            Integer avg = ListIterator.previous();
            System.out.println(avg);
        }
    }
}
输出:
Iteration over the Stack from top to bottom:
988
203
119

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4