Java中的Stack

news2024/12/27 23:59:17

Java中的Stack

在这里插入图片描述

在这里插入图片描述

在Java中,Stack 类是一个基于后进先出(Last In, First Out,LIFO)原则的集合类。它继承自Vector类,但主要被设计为提供栈的行为。

在这里插入图片描述

特点和用途

  1. 后进先出: 栈是一种后进先出的数据结构,最后压入栈的元素将最先弹出。

  2. 继承关系: Stack 类继承自 Vector 类,因此它包含了向量的所有方法,并且可以通过这些方法实现栈的操作。

  3. 基本操作:

    • push(E item): 将元素推入栈的顶部。
    • pop(): 移除并返回栈顶的元素。
    • peek(): 返回栈顶的元素,但不移除它。
    • isEmpty(): 判断栈是否为空。
    • search(Object o): 查找元素在栈中的位置,返回距栈顶最近的索引,栈顶的位置为1。
  4. 用途: 栈在很多算法和程序中有广泛应用,例如递归、表达式求值、浏览器的前进和后退功能等。

示例

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        // 创建一个栈
        Stack<String> stack = new Stack<>();

        // 元素入栈
        stack.push("Java");
        stack.push("C++");
        stack.push("Python");

        // 输出栈顶元素
        System.out.println("Top element: " + stack.peek());

        // 弹出栈顶元素
        String poppedElement = stack.pop();
        System.out.println("Popped element: " + poppedElement);

        // 判断栈是否为空
        System.out.println("Is stack empty? " + stack.empty());

        // 查找元素在栈中的位置
        int position = stack.search("Java");
        System.out.println("Position of 'Java': " + position);
    }
}

上述示例演示了Stack类的基本用法,包括元素的推入、弹出、查看栈顶元素以及其他一些常见的操作。在实际应用中,Deque接口的实现类ArrayDeque也可以用作栈的替代品,因为它提供了更好的性能。

利用数组来模拟栈

package stackDemo;

import java.util.Arrays;
import java.util.Scanner;

import javax.sound.midi.Synthesizer;

import org.omg.Messaging.SyncScopeHelper;

public class ShuzuStack {

	public static void main(String[] args) {
		ArrayStack arrayStack = new ArrayStack(4);
		String key = "";
		boolean loop = true;
		Scanner scanner = new Scanner(System.in);
		
		while(loop){
			System.out.println("show:表示显示栈");
			System.out.println("exit:退出程序");
			System.out.println("push:表示添加数据到栈");
			System.out.println("pop:表示从栈取出数据");
			System.out.println("请输入");
			key = scanner.next();
			
			switch(key){
			case"show":
				arrayStack.list();
				break;
			case"push":
				System.out.println("请输入一个数");
				int value = scanner.nextInt();
				arrayStack.push(value);
				break;
			case"pop":
				try {
					int res = arrayStack.pop();
					System.out.println("出栈的数据是"+res);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case"exit":
				scanner.close();
				System.out.println("拜拜");
				loop = false;
				break;
			default:
				break;
			}
		}
		

	}

}

class ArrayStack{
	private int maxSize;
	private int[] stack;
	private int top = -1;
	
	public ArrayStack(int maxSize){
		this.maxSize = maxSize;
		stack = new int[this.maxSize];
	}
	
	//栈满
	public boolean isFull(){
		return top == maxSize-1;
	}
	
	//栈空
	public boolean isEmpty(){
		return top == -1;
	}
	
	//入栈
	public void push(int value){
		if(isFull()){
			System.out.println("栈满");
			return;
		}
		top++;
		stack[top] = value;
	}
	
	//出栈
	public int pop(){
		if(isEmpty()){
			throw new RuntimeException("栈空,没有数据");
		}
		int value = stack[top];
		top--;
		return value;
	}
	
	public void list(){
		if(isEmpty()){
			System.out.println("栈空");
		}else{
			//System.out.println(Arrays.asList(stack));
			for(int i = 0;i<maxSize;i++){
				System.out.println(stack[i]+" ");
			}
		}
	}
}



用链表创建栈

采用的是单链表,头插法。设置节点top,采用第一种方法,使得top始终在最顶端,非常巧妙。

package stackDemo;

import org.omg.Messaging.SyncScopeHelper;

public class LinkStack {
	public static void main(String[] args){
		Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        SingleLinkedListStack singleLinkedListStack = new SingleLinkedListStack();
        singleLinkedListStack.push(node1);
        singleLinkedListStack.push(node2);
        singleLinkedListStack.push(node3);
        singleLinkedListStack.push(node4);
        singleLinkedListStack.pop();
        singleLinkedListStack.show();
	}
}
class SingleLinkedListStack{
	private Node top = new Node(0);
	
	//判断栈是否为空
	public boolean isEmpty(){
		return top.next == null;	
	}
	
	//入栈
	public void push(Node node){
		if(isEmpty()){
			top.next = node;
			return;
		}
		//定义辅助变量。
		//一:将nodet给top的next
		//二:将temp的值给node的next域
		Node temp = top.next;
		top.next = node;
		node.next = temp;
	}
	
	//出栈
	public void pop(){
		if(isEmpty()){
			System.out.println("栈空");
			return;
		}
		System.out.println("出栈节点为:"+top.next.value);
		top = top.next;
	}
	
	//遍历
	public void show(){
		if(isEmpty()){
			System.out.println("栈为空");
			return;
		}
		Node temp = top;
		while(temp.next  != null){
			System.out.println("节点为"+temp.next.value);
			temp = temp.next;
		}
	}
}

class Node{
	public int value;
	public Node next;
	
	public Node(int value){
		this.value = value;
	}
	
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1362476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS学习笔记(11)进一步深入了解ROS第五步

0.前提 我在学习宾夕的ROS公开课的时候发现&#xff0c;外国的对计算机的教育和国内的是完全不一样的&#xff0c;当你接触了外国的课程后回头看自己学的会发现好像自己啥也没学。我这里可以放出来给大家看一下。 1.Python and C 2.Python PDB Tutorial&#xff1a;Python Deb…

Keil使用手册

文章目录 1 设置1.1 背景1.2 Project窗口显示.h文件1.3 注释1.4 Project窗口消失TAB转空格的设置keilsourceInsight 显示cannot evaluate普通局部变量静态全局变量静态局部变量 2 报错与解决2.1 warning&#xff1a;#1-D last line of file ends without anewline2.2 中文乱码 …

科研学习|论文解读——超准确性反馈:使用眼动追踪来检测阅读过程中的可理解性和兴趣

摘要&#xff1a; 了解用户想要什么信息是信息科学和技术面临的最大挑战。隐式反馈是解决这一挑战的关键&#xff0c;因为它允许信息系统了解用户的需求和偏好。然而&#xff0c;可用的反馈往往是有限的&#xff0c;而且其解释也很困难。为了应对这一挑战&#xff0c;我们提出了…

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一&#xff1a;通过packages页面打包 1.下载packages app Distribution&#xff1a;自定义化更高&#xff0c;包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目&#xff1a;通过unix可执行文件postinstall.sh脚本实现通过ma…

QT项目中添加资源文件和使用qss样式

时间记录&#xff1a;2024/1/6 一、添加使用资源文件 1.1 创建项目并打开项目&#xff08;带ui界面的项目&#xff09; 1.2 使用快捷键Ctrln创建文件&#xff0c;选择"QT"下面的"QT Resource File" 1.3 输入文件名和文件保存路径 1.4 将需要添加的文件…

Call to undefined function app\install\controller\mysqli_connect()

找到php.ini&#xff0c;放开mysqli扩展 https://stackoverflow.com/questions/25281467/fatal-error-call-to-undefined-function-mysqli-connect

FCN学习-----第一课

语义分割中的全卷积网络 CVPR IEEE国际计算机视觉与模式识别会议 PAMI IEEE模式分析与机器智能汇刊 需要会的知识点&#xff1a; 神经网络&#xff1a;前向传播和反向传播 卷积神经网络&#xff1a;CNN&#xff0c;卷积&#xff0c;池化&#xff0c;上采样 分类网络&#xff1a…

物流实时数仓:数仓搭建(DWS)一

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&am…

进阶C语言学习前序

我们前期用了二十天的时间&#xff0c;学习了各种函数&#xff0c;我们已经初步具有敲写代码的能力&#xff0c;但是我们想要使用C语言去学习单片机的东西还是远远不够的&#xff0c;那么我们就需要深入了解和掌握更加深入的C语言知识&#xff0c;就有了接下来的学习计划&#…

Vmware ESXI上安装的虚拟机无法开启

背景 今天看下了Vmware ESXI上安装的虚拟机&#xff0c;点击无反应&#xff0c;也无法开启&#xff0c;日志提示“已打开电源&#xff0c;无法操作”。 注意 注意查看&#xff0c;虚拟机无法启动提示的内容。(当前磁盘文件是否可以在存储中找到&#xff0c;一般是vmdk结尾的)…

Rocky9.3 安装MySQL后如何设置初始密码

Rocky9.3 安装MySQL后如何设置初始密码 启动MySQL服务查看临时密码设置新密码 启动MySQL服务 安装MySQL后需要看一下服务是否已经启动&#xff1a; systemctl status mysqld如果没有启动的话&#xff0c;需要先启动MySQL服务&#xff1a; systemctl start mysqld # 临时启动…

Java jSerialComm库串口通信(USB RS-485/232) 查询/应答、主动上报模式

Java jSerialComm库串口通信(USB RS-485/232) 查询/应答、主动上报模式 查询/应答模式 要在Java中通过USB RS-485接口发送和接收特定的数据帧&#xff0c;你需要利用适当的串行通信库。在Java中&#xff0c;一个常见的选择是使用RXTX或jSerialComm库。这些库允许Java应用程序与…

LabVIEW开发自动读取指针式仪表测试系统

LabVIEW开发自动读取指针式仪表测试系统 在工业领域&#xff0c;尤其是煤矿、变电站和集气站等环境中&#xff0c;指针式仪表因其简单的结构、抗干扰能力强以及能适应高温高压等恶劣环境条件而被广泛应用于设备运行状态监视。然而&#xff0c;传统的人工读表方式不仅成本高昂&…

Pygame和Cocos2d

Pygame和Cocos2d都是 Python 中常用的游戏引擎&#xff0c;但它们的设计目标、特点和使用场景略有不同。 Pygame与Cocos2d&#xff0c;目前是使用人数最多的两个Python游戏库。根据某知名产品点评网站的数据显示&#xff0c;排名前五的Python 2D游戏库如下图所示。其中&#x…

【linux踩雷】Ubuntu中su root密码无法使用

【linux踩雷】Ubuntu中su root密码无法使用 在ubuntu的安装过程中&#xff0c;没有出现设置root密码&#xff0c;以为密码为空&#xff0c;但是却不能使用 解决方法&#xff1a; 先用sudo passwd更改密码&#xff0c;再去su root就可以了。

python数据可视化之折线图案例讲解

学习完python基础知识点&#xff0c;终于来到了新的模块——数据可视化。 我理解的数据可视化是对大量的数据进行分析以更直观的形式展现出来。 今天我们用python数据可视化来实现一个2023年三大购物平台销售额比重的折线图。 准备工作&#xff1a;我们需要下载用于生成图表的第…

机器学习(四) -- 模型评估(3)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…

稿件代写3个不可或缺的步骤让你事半功倍-华媒舍

作为一个需求频繁的作者&#xff0c;你可能会面临大量的稿件代写任务。但是&#xff0c;你是否曾经为提高文章质量而苦恼过&#xff1f;是否希望在有限的时间内完成更多的代写任务&#xff1f;本篇文章将向你介绍三个不可或缺的稿件代写步骤&#xff0c;帮助你事半功倍&#xf…

java预科

文章目录 预科什么是计算机?硬件及冯诺依曼结构Windows常用快捷键常用的DOS命令 预科 什么是计算机? 名称&#xff1a;Computer&#xff0c;全称电子计算机&#xff0c;俗称电脑。 定义&#xff1a;能够按照程序运行&#xff0c;自动、高速处理海量数据的现代化智能电子设备…

C语言程序设计——数学运算

基本运算符 运算符说明例子赋值运算符a b;、-、*、/、()基本四则运算a (a c) * d;%取余运算符a b % 2&、^、~、l位运算a ~b l c>>、<<左移和右移a b >> 2 在c语言的数学运算中&#xff0c;所涉及到的符号如图所示&#xff0c;在使用过程中应该了…