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

java数据结构-栈

栈的定义

栈(stack)作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。
Stack
找这张图片找了好久,诠释了栈这个数据结构,及其基本操作。从图中可以看出,图一,初始时,top=-1 ,这是一个空栈。
图二,入栈操作,top++stack[top] = a;
图三,入栈操作,top++stack[top] =b;
图四,出栈操作,int value = stack[top];top--

栈的java代码实现(用数组实现)

//定义一个 ArrayStack 表示栈
class ArrayStack {
	private int maxSize; // 栈的大小
	private int[] stack; // 数组,数组模拟栈,数据就放在该数组
	private int top = -1;// 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;
	}
	//入栈-push
	public void push(int value) {
		//先判断栈是否满
		if(isFull()) {
			System.out.println("栈满");
			return;
		}
		top++;
		stack[top] = value;
	}
	//出栈-pop, 将栈顶的数据返回
	public int pop() {
		//先判断栈是否空
		if(isEmpty()) {
			//抛出异常
			throw new RuntimeException("栈空,没有数据~");
		}
		int value = stack[top];
		top--;
		return value;
	}
	//显示栈的情况[遍历栈], 遍历时,需要从栈顶开始显示数据
	public void list() {
		if(isEmpty()) {
			System.out.println("栈空,没有数据~~");
			return;
		}
		//需要从栈顶开始显示数据
		for(int i = top; i >= 0 ; i--) {
			System.out.printf("stack[%d]=%d\n", i, stack[i]);
		}
	}
	
}

测试程序

public class ArrayStackDemo {

	public static void main(String[] args) {
		//测试一下ArrayStack 是否正确
		//先创建一个ArrayStack对象->表示栈
		ArrayStack stack = 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":
				stack.list();
				break;
			case "push":
				System.out.println("请输入一个数");
				int value = scanner.nextInt();
				stack.push(value);
				break;
			case "pop":
				try {
					int res = stack.pop();
					System.out.printf("出栈的数据是 %d\n", res);
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println(e.getMessage());
				}
				break;
			case "exit":
				scanner.close();
				loop = false;
				break;
			default:
				break;
			}
		}
		
		System.out.println("程序退出~~~");
	}

}

栈的一些思考

这里可能有人会问,为什么top初始始时为-1,其实,top=0也是没有问题的。你完全可以实现一个栈,栈顶指针指向栈顶第一个元素。没人规定一定要指向栈顶元素下一个位置。

相关文章:

  • java数据结构-8皇后问题和N 皇后问题
  • java-数据结构-冒泡排序
  • java-数据结构-选择排序
  • java-数据结构-插入排序
  • java-数据结构-希尔排序
  • java-数据结构-快速排序
  • java-数据结构-归并排序
  • java-数据结构-基数排序(桶排序)
  • java-数据结构-顺序查找
  • java-数据结构-二分查找(折半查找)
  • java-数据结构-插值查找
  • java-数据结构-前中后序遍历
  • java-数据结构-前中后序查找
  • java-数据结构-顺序存储二叉树
  • java-数据结构-线索化二叉树
  • hexo+github搭建个人博客
  • 时间复杂度分析经典问题——最大子序列和
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【391天】每日项目总结系列128(2018.03.03)
  • 从输入URL到页面加载发生了什么
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用parted解决大于2T的磁盘分区
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信公众号开发小记——5.python微信红包
  • 怎么把视频里的音乐提取出来
  • ​2021半年盘点,不想你错过的重磅新书
  • ​学习一下,什么是预包装食品?​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • $().each和$.each的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (一)Linux+Windows下安装ffmpeg
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net wcf memory gates checking failed
  • .NET 中的轻量级线程安全
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET中统一的存储过程调用方法(收藏)
  • @ModelAttribute使用详解
  • @test注解_Spring 自定义注解你了解过吗?
  • [ Linux ] Linux信号概述 信号的产生
  • [20180224]expdp query 写法问题.txt
  • [Android 13]Input系列--获取触摸窗口
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [BUG]vscode插件live server无法自动打开浏览器
  • [BZOJ2850]巧克力王国
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [codeforces] 25E Test || hash
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽