当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java Stack用法及代码示例


Java 集合框架提供一个 Stack 类,该类建模并实现栈数据结构。该类基于后进先出的基本原则。除了基本的入栈和出栈操作外,该类还提供了清空、搜索和查看三个函数。该类也可以说是对 Vector 的扩展,并将该类视为具有上述五个函数的堆栈。该类也可以称为 Vector 的子类。

下图显示了Stack类的层次结构:

Stack Class in Java

类支持一默认构造函数 Stack()这是用来创建一个空堆栈

声明:

public class Stack<E> extends Vector<E>

所有实现的接口:

  • 可序列化:它是类要进行序列化和反序列化时必须实现的标记接口。
  • 可克隆:这是Java中的一个接口,需要由类实现以允许克隆其对象。
  • 可迭代<E>:该接口表示可迭代的对象集合——意味着可以迭代。
  • 集合<E>:集合表示一组称为其元素的对象。 Collection 接口用于传递需要最大通用性的对象集合。
  • List InterfaceList 接口提供了一种存储有序集合的方法。它是 Collection 的子接口。
  • 随机访问:这是 List 实现使用的标记接口,用于指示它们支持快速(通常是恒定时间)随机访问。

如何创建堆栈?

为了创建堆栈,我们必须导入java.util.stack打包并使用该类的Stack()构造函数。下面的示例创建一个空堆栈。

Stack<E> stack = new Stack<E>();

这里E是Object的类型。

例子:

Java


// Java code for stack implementation
import java.io.*;
import java.util.*;
class Test
{   
    // Pushing element on the top of the stack
    static void stack_push(Stack<Integer> stack)
    {
        for(int i = 0; i < 5; i++)
        {
            stack.push(i);
        }
    }
     
    // Popping element from the top of the stack
    static void stack_pop(Stack<Integer> stack)
    {
        System.out.println("Pop Operation:");
        for(int i = 0; i < 5; i++)
        {
            Integer y = (Integer) stack.pop();
            System.out.println(y);
        }
    }
    // Displaying element on the top of the stack
    static void stack_peek(Stack<Integer> stack)
    {
        Integer element = (Integer) stack.peek();
        System.out.println("Element on stack top: " + element);
    }
     
    // Searching element in the stack
    static void stack_search(Stack<Integer> stack, int element)
    {
        Integer pos = (Integer) stack.search(element);
        if(pos == -1)
            System.out.println("Element not found");
        else
            System.out.println("Element is found at position: " + pos);
    }
    public static void main (String[] args)
    {
        Stack<Integer> stack = new Stack<Integer>();
        stack_push(stack);
        stack_pop(stack);
        stack_push(stack);
        stack_peek(stack);
        stack_search(stack, 2);
        stack_search(stack, 6);
    }
}

输出:

Pop Operation:
4
3
2
1
0
Element on stack top: 4
Element is found at position: 3
Element not found

对 Stack 类执行各种操作

1. 添加元素:为了将元素添加到堆栈中,我们可以使用push()方法.这Stack push()操作将元素置于栈顶。

Java


// Java program to add the
// elements in the stack
import java.io.*;
import java.util.*;
class StackDemo {
   
      // Main Method
    public static void main(String[] args)
    {
        // Default initialization of Stack
        Stack stack1 = new Stack();
        // Initialization of Stack
        // using Generics
        Stack<String> stack2 = new Stack<String>();
        // pushing the elements
        stack1.push("4");
        stack1.push("All");
        stack1.push("Geeks");
        stack2.push("Geeks");
        stack2.push("For");
        stack2.push("Geeks");
          // Printing the Stack Elements
        System.out.println(stack1);
        System.out.println(stack2);
    }
}

输出:

[4, All, Geeks]
[Geeks, For, Geeks]

2. 访问元素:要检索或获取堆栈的第一个元素或堆栈顶部的元素,我们可以使用Stack peek()方法。检索到的元素不会被删除或从堆栈中移除。

Java


// Java program to demonstrate the accessing
// of the elements from the stack
import java.util.*;
import java.io.*;
public class StackDemo {
      // Main Method
    public static void main(String args[])
    {
        // Creating an empty Stack
        Stack<String> stack = new Stack<String>();
        // Use push() to add elements into the Stack
        stack.push("Welcome");
        stack.push("To");
        stack.push("Geeks");
        stack.push("For");
        stack.push("Geeks");
        // Displaying the Stack
        System.out.println("Initial Stack: " + stack);
        // Fetching the element at the head of the Stack
        System.out.println("The element at the top of the"
                           + " stack is: " + stack.peek());
        // Displaying the Stack after the Operation
        System.out.println("Final Stack: " + stack);
    }
}

输出:

Initial Stack: [Welcome, To, Geeks, For, Geeks]
The element at the top of the stack is: Geeks
Final Stack: [Welcome, To, Geeks, For, Geeks]

3. 删除元素:要从堆栈中弹出一个元素,我们可以使用Stack pop()方法。该元素从堆栈顶部弹出并从堆栈中删除。

Java


// Java program to demonstrate the removing
// of the elements from the stack
import java.util.*;
import java.io.*;
public class StackDemo {
    public static void main(String args[])
    {
        // Creating an empty Stack
        Stack<Integer> stack = new Stack<Integer>();
        // Use add() method to add elements
        stack.push(10);
        stack.push(15);
        stack.push(30);
        stack.push(20);
        stack.push(5);
        // Displaying the Stack
        System.out.println("Initial Stack: " + stack);
        // Removing elements using pop() method
        System.out.println("Popped element: "
                           + stack.pop());
        System.out.println("Popped element: "
                           + stack.pop());
        // Displaying the Stack after pop operation
        System.out.println("Stack after pop operation "
                           + stack);
    }
}

输出:

Initial Stack: [10, 15, 30, 20, 5]
Popped element: 5
Popped element: 20
Stack after pop operation [10, 15, 30]

示例

在 Java 中,Stack 类是 Vector 类的子类,表示对象的后进先出 (LIFO) 堆栈。它扩展了 Vector 类,以便轻松实现堆栈数据结构。

以下是如何在 Java 中使用 Stack 类的示例:

Java


import java.util.Stack;
public class StackExample {
    public static void main(String[] args) {
        // Create a new stack
        Stack<Integer> stack = new Stack<>();
        // Push elements onto the stack
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        // Pop elements from the stack
        while(!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }
}
输出
4
3
2
1


在此示例中,我们首先从 java.util 包中导入 Stack 类。然后,我们使用默认构造函数创建一个名为 stack 的新 Stack 对象。我们使用 push() 方法将四个整数压入堆栈。然后,我们在 while 循环内使用 pop() 方法从堆栈中弹出元素。 isEmpty() 方法用于在尝试弹出元素之前检查堆栈是否为空。

此代码创建一个整数堆栈,并按 1 -> 2 -> 3 -> 4 的顺序将 4 个整数压入堆栈。然后,我们使用 pop() 方法从堆栈中逐个弹出元素,该方法会删除并返回栈顶元素。由于堆栈遵循后进先出 (LIFO) 顺序,因此会以与插入相反的顺序弹出元素,从而产生如上所示的输出。

Stack 类提供了其他几种操作堆栈的方法,例如 peek() 检索顶部元素而不删除它,search() 搜索堆栈中的元素并返回其位置,以及 size() 返回当前元素堆栈的大小。 Stack 类还提供了几个构造函数,用于创建具有指定初始容量的堆栈或通过复制现有堆栈。

堆栈类中的方法

METHOD

DESCRIPTION

Stack empty()

如果堆栈顶部没有任何内容,则返回 true。否则,返回 false。

Stack peek()

返回栈顶元素,但不删除它。

Stack pop()

移除并返回栈顶元素。 “EmptyStackException”

如果我们在调用堆栈为空时调用pop(),则会引发异常。

Stack push()

将一个元素压入栈顶。

Stack search()

它判断堆栈中是否存在对象。如果找到该元素,

它从堆栈顶部返回元素的位置。否则,返回-1。

从类 java.util.Vector 继承的方法

METHOD

DESCRIPTION

Vector add() 将指定元素追加到此 Vector 的末尾。
Vector add() 在此 Vector 中的指定位置插入指定元素。
Vector addAll()

将指定 Collection 中的所有元素追加到此 Vector 的末尾,

按照指定集合的迭代器返回它们的顺序。

Vector addAll() 将指定 Collection 中的所有元素插入此 Vector 的指定位置。
Vector addElement() 将指定的组件添加到此向量的末尾,将其大小增加一。
Vector capacity() 返回该向量的当前容量。
Vector clear() 从此向量中删除所有元素。
Vector clone() 返回此向量的克隆。
Vector contains() 如果此向量包含指定元素,则返回 true。
Vector containsAll() 如果此 Vector 包含指定 Collection 中的所有元素,则返回 true。
Vector copyInto() 将此向量的分量复制到指定的数组中。
Vector elementAt() 返回指定索引处的组件。
Vector elements() 返回此向量的分量的枚举。
Vector ensureCapacity()

如有必要,增加此向量的容量,以确保它可以容纳

至少由最小容量参数指定的组件数量。

Vector equals() 比较指定的 Object 与此 Vector 是否相等。
Vector firstElement() 返回该向量的第一个分量(索引 0 处的项)。
Vector get() 返回此 Vector 中指定位置的元素。
Vector hashCode() 返回此 Vector 的哈希码值。
Vector indexOf()

返回指定元素在此向量中第一次出现的索引,或 -1

如果该向量不包含该元素。

Vector indexOf() 返回指定元素在此向量中第一次出现的索引,从该索引向前搜索,如果未找到该元素,则返回 -1。
Vector insertElementAt() 将指定对象作为组件插入此向量中的指定索引处。
Vector isEmpty() 测试该向量是否没有分量。
Vector iterator() 按正确顺序返回此列表中元素的迭代器。
Vector lastElement() 返回向量的最后一个分量。
Vector lastIndexOf()

返回此向量中最后一次出现的指定元素的索引,或 -1

如果该向量不包含该元素。

Vector lastIndexOf()

返回此向量中最后一次出现的指定元素的索引,

从索引向后搜索,如果未找到该元素,则返回 -1。

Vector listIterator() 返回此列表中元素的列表迭代器(按正确的顺序)。
Vector listIterator()

返回列表中元素的列表迭代器(按正确的顺序),

从列表中的指定位置开始。

Vector remove() 删除此 Vector 中指定位置的元素。
Vector remove() 删除此 Vector 中第一次出现的指定元素。如果 Vector 不包含该元素,则该元素保持不变。
Vector removeAll() 从此 Vector 中删除指定 Collection 中包含的所有元素。
Vector removeAllElements() 从此向量中删除所有组件并将其大小设置为零。
Vector removeElement() 从此向量中删除第一个 (lowest-indexed) 出现的参数。
Vector removeElementAt() 删除指定索引处的组件。
Vector removeRange() 从此列表中删除索引介于 fromIndex(包含)和 toIndex(不包含)之间的所有元素。
Vector retainAll() 仅保留此 Vector 中包含在指定 Collection 中的元素。
Vector set() 将此 Vector 中指定位置的元素替换为指定元素。
Vector setElementAt() 将此向量的指定索引处的组件设置为指定对象。
Vector setSize() 设置该向量的大小。
Vector size() 返回此向量中的分量数。
Vector subList() 返回此列表中介于 fromIndex(包含)和 toIndex(不包含)之间的部分的视图。
Vector toArray() 返回一个数组,其中按正确顺序包含此 Vector 中的所有元素。
Vector toArray()

返回一个数组,其中按正确顺序包含此 Vector 中的所有元素;运行时

返回数组的类型是指定数组的类型。

Vector toString() 返回此 Vector 的字符串表示形式,其中包含每个元素的字符串表示形式。
Vector trimToSize() 将此向量的容量修剪为向量的当前大小。

优先使用双端队列堆栈之上 -:

Java中的Stack类是一个遗留类,继承自Vector。它是一个线程安全的类,因此当我们不需要线程安全时会产生开销。推荐使用ArrayDeque 用于堆栈实现,因为它在单线程环境中更有效。

Java


// A Java Program to show implementation
// of Stack using ArrayDeque
import java.util.*;
class GFG {
    public static void main (String[] args) {
        Deque<Character> stack = new ArrayDeque<Character>();
        stack.push('A');
        stack.push('B');
        System.out.println(stack.peek());
        System.out.println(stack.pop());
    }
}

输出:

B
B

使用 Deque 而不是 Stack 的另一个原因是 Deque 能够使用流转换为列表并保持 LIFO 概念的应用,而 Stack 则不能。

Java


import java.util.*;
import java.util.stream.Collectors;
class GFG {
    public static void main (String[] args) {
  
          Stack<Integer> stack = new Stack<>();
        Deque<Integer> deque = new ArrayDeque<>();
        stack.push(1);//1 is the top
        deque.push(1);//1 is the top
        stack.push(2);//2 is the top
        deque.push(2);//2 is the top
        List<Integer> list1 = stack.stream().collect(Collectors.toList());//[1,2]
          System.out.println("Using Stack -");
          for(int i = 0; i < list1.size(); i++){
              System.out.print(list1.get(i) + " " );
        }
          System.out.println();
        List<Integer> list2 = deque.stream().collect(Collectors.toList());//[2,1]
          System.out.println("Using Deque -");
          for(int i = 0; i < list2.size(); i++){
              System.out.print(list2.get(i) + " " );
        }
          System.out.println();
       
    }
}
输出
Using Stack -
1 2 
Using Deque -
2 1 



相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Stack Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。