使用 Java 的 DSA -堆栈

概述

Stack 堆栈是一种数据结构,它只允许在一端对数据进行操作。它只允许访问最后插入的数据。Stack 也称为 LIFO(后进先出)数据结构,Push 和 Pop 操作以这样的方式相关:只有最后推送(添加到堆栈)的项目才能弹出(从堆栈中删除)。

Stack 表示

Stack

我们将在本文中使用数组实现 Stack。

基本操作

以下是堆栈的两个主要操作。

  • Push −将元素推送到堆栈顶部。

  • Pop − 从堆栈顶部弹出一个元素。

堆栈支持以下几个操作。

  • Peek − 获取堆栈顶部元素。

  • isFull − 检查堆栈是否已满。

  • isEmpty − 检查堆栈是否为空。

推送操作

每当将元素推送到堆栈时,堆栈都会将该元素存储在存储的顶部并增加顶部索引以供以后使用。如果存储已满,通常会显示错误消息。

推送操作
// 将项目推送到堆栈顶部 
public void push(int data) {

   if(!isFull()){
      // 将 top 加 1 并插入数据
      intArray[++top] = data;
   }else{
      System.out.println("Cannot add data. Stack is full.");
   }      
}

弹出操作

每当要从堆栈中弹出一个元素时,堆栈都会从存储顶部检索该元素并减少顶部索引以供以后使用。

弹出操作
// 从堆栈顶部弹出项目
public int pop() {
    // 检索数据并将顶部减少 1
    return intArray[top--];
}

堆栈实现

Stack.java

package com.tutorialspoint.datastructure;

public class Stack {
    private int size; // 堆栈的大小
    private int[] intArray; // 堆栈存储
    private int top; // 堆栈顶部
    
    // 构造函数
    public Stack(int size){
        this.size = size;
        intArray = new int[size]; //初始化数组
        top = -1; //堆栈最初为空
    }
    
    // 操作:推送
    // 将项目推送到堆栈顶部
    public void push(int data) {
    
        if(!isFull()){
            // 将顶部增加 1 并插入数据
            intArray[++top] = data;
        }else{
            System.out.println("无法添加数据。堆栈已满。");
        }
    }
    
    // 操作:弹出
    // 从堆栈顶部弹出项目
    public int pop() {
        //检索数据并将顶部减少 1
        return intArray[top--];
    }
    
    // 操作:Peek
    // 查看堆栈顶部的数据
    public int peek() {
        // 从顶部检索数据
        return intArray[top];
    }
    
    // 操作:isFull
    // 如果堆栈已满,则返回 true
    public boolean isFull(){
        return (top == size-1);
    }
    
    // 操作:isEmpty
    // 如果堆栈为空,则返回 true
    public boolean isEmpty(){
        return (top == -1);
    }
}

演示程序

StackDemo.java

package com.tutorialspoint.datastructure;

public class StackDemo {
   public static void main (String[] args){

        // 创建新堆栈
        Stack stack = new Stack(10);
        
        // 将项目推送到堆栈上
        stack.push(3);
        stack.push(5);
        stack.push(9);
        stack.push(1);
        stack.push(12);
        stack.push(15);
        
        System.out.println("堆栈顶部的元素:" + stack.peek());
        System.out.println("元素:");
        
        // 打印堆栈数据
        while(!stack.isEmpty()){
         int data = stack.pop();
         System.out.println(data);
        }
             
        System.out.println("堆栈已满: " + stack.isFull());
        System.out.println("堆栈为空: " + stack.isEmpty());
   }
}

如果我们编译并运行上述程序,则会产生以下结果 −

堆栈顶部的元素:15
元素:
15
12
1
9
5
3
堆栈已满:false
堆栈为空:true