当前位置: 首页 > news >正文

【数据结构】Java实现栈

目录

1. 概念

2. 栈的使用 

3. 自己动手实现栈(使用动态数组实现栈) 

1. 创建一个MyStack类

2. push入栈

3. pop出栈

4. 查看栈顶元素

5. 判断栈是否为空与获取栈长

6. toString方法

4. 整体实现

4.1 MyStack类

4.2 Test类

4.3 测试结果


1. 概念

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶

2. 栈的使用 

public static void main(String[] args) {Stack<Integer> stack = new Stack<>();
//        将e入栈,并返回estack.push(1);stack.push(2);stack.push(3);stack.push(4);stack.push(5);
//        将栈顶元素出栈并返回System.out.println(stack.pop());
//        获取栈顶元素System.out.println(stack.peek());
//        检测栈是否为空System.out.println(stack.empty());
//        获取栈中有效元素个数System.out.println(stack.size());System.out.println(stack);}

3. 自己动手实现栈(使用动态数组实现栈) 

1. 创建一个MyStack类

思路图:

import java.util.Arrays;
import java.util.NoSuchElementException;
//使用泛型
public class MyStack<E> {private Object[] data;private int size;public MyStack(int capacity){this.data = new Object[capacity];}public MyStack(){this.data = new Object[10];}}

2. push入栈

public E push(E val){data[size ++] = val;if(size == data.length){data = Arrays.copyOf(data,data.length<<1);}return val;}

3. pop出栈

public E pop(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot pop!");}E oldVal = (E)data[size - 1];size --;return oldVal;}

4. 查看栈顶元素

public E peek(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot peek!");}return (E)data[size - 1];}

5. 判断栈是否为空与获取栈长

public boolean isEmpty() {return size == 0;}public int size(){return size;}

6. toString方法

public String toString() {StringBuilder sb = new StringBuilder();sb.append("bottom [");for (int i = 0; i < size; i++) {sb.append(data[i]);if(i < size - 1){sb.append(",");}}sb.append("] top");return sb.toString();}

4. 整体实现

4.1 MyStack类

package seqlist.stack_queue;import java.util.Arrays;
import java.util.NoSuchElementException;public class MyStack<E> {private Object[] data;private int size;public MyStack(int capacity){this.data = new Object[capacity];}public MyStack(){this.data = new Object[10];}public E push(E val){data[size ++] = val;if(size == data.length){data = Arrays.copyOf(data,data.length<<1);}return val;}public boolean isEmpty() {return size == 0;}public int size(){return size;}public E pop(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot pop!");}E oldVal = (E)data[size - 1];size --;return oldVal;}public E peek(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot peek!");}return (E)data[size - 1];}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("bottom [");for (int i = 0; i < size; i++) {sb.append(data[i]);if(i < size - 1){sb.append(",");}}sb.append("] top");return sb.toString();}
}

4.2 Test类

public static void main(String[] args) {MyStack<Integer> stack = new MyStack<>();
//        将e入栈,并返回estack.push(1);stack.push(2);stack.push(3);stack.push(4);stack.push(5);System.out.println("将栈顶元素出栈并返回");System.out.println(stack.pop());System.out.println("获取栈顶元素");System.out.println(stack.peek());System.out.println("检测栈是否为空");System.out.println(stack.isEmpty());System.out.println("获取栈中有效元素个数");System.out.println(stack.size());System.out.println(stack);}

4.3 测试结果

 【例题】一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )

        A. ABCDE

        B. EDCBA

        C. DCEBA

        D. ECDBA

稳妥的做法是画图逐个选项检测,大概率是不会出错的,

如果是E先出,说明ABCDE都已经全部入栈,E出栈之后,此时栈顶元素是D,如果再要出栈应该是D,而不应该是C。故应该选择D。

http://www.lryc.cn/news/42183.html

相关文章:

  • 【数据结构】排序
  • 过拟合、验证集、交叉验证
  • 原力计划来了【协作共赢 成就未来】
  • 一文了解Jackson注解@JsonFormat及失效解决
  • webpack——使用、分析打包代码
  • libvirt零知识学习5 —— libvirt源码编译安装(3)
  • Nmap 的使用教程
  • async与await异步编程
  • 移动应用架构设计:如何转变开发流程
  • NX二次开发 图层函数总结
  • windows微服务部署
  • Java四种内部类(看这一篇就够了)
  • 蓝桥杯刷题第二十天
  • 如何通过命令行查看CentOS版本信息和linux系统信息
  • oracle查询表空间大小以及每个表所占空间的大小
  • C语言通讯录应用程序:从设计到实现
  • 银河麒麟v10sp2安装nginx
  • 华为笔试题OD
  • Win10+Anconda安装.whl文件到指定环境——以pycocotools为例
  • 全自动托盘四向穿梭车|拥有输送系统提升机AGV的托盘四向穿梭车立体库的软硬件配置系统
  • 【Linux】进程概念二
  • 如何用C语言实现渣男通讯录
  • 【从零开始的C语言】操作符详解
  • 黑马在线教育数仓实战1
  • python中pandas模块数据处理小案例
  • 从 X 入门Pytorch——Tensor的自动微分、计算图,常见的with torch.no_grad()机制
  • 三十七、实战演练之接口自动化平台的文件上传
  • 菜鸟刷题Day1
  • cjson文件格式介绍
  • 【Nginx二】——Nginx常用命令 配置文件