栈的最优实现(数组实现)

一、对栈的简单理解

1、栈是一种运算受限(只允许在表尾进行插入和删除)的线性表(先入后出);
2、栈是对程序指令进行顺序控制的;
3、(与线程的关系)每个线程都有一个线程栈,线程之内的所有方法(也称为线程栈方法)都对Threadlocal共享,出了线程就不再共享。
4、从栈中每次取出的数据都是最新数据,可以边放入边取出。

在这里插入图片描述

二、用数组实现栈的进出操作

为什么用数组实现而不用链表呢?
很简单,最大原因之一就是数组比链表节省大量的空间。

下面的代码使用数组来实现栈中元素的进出:

public class StackDemo {
	private int[] arr = new int[20];
	private int top = 0;
	
	//进栈
	public void add(int a) {
		//进栈的具体操作
		arr[top] = a;
		top++;
		
		//当栈满的时候,进行扩充(通过数组拷贝实现扩充)
		if(top == arr.length) {
			int[] arrnew = new int[arr.length * 2];
			for(int i = 0;i<arrnew.length;i++) {
				arrnew[i] = arr[i];
			}
			arr = arrnew;
		}
	}
	//出栈
	public void dedl() {
		if(top<1) {  //对栈是否非空做一个判断
			System.out.println("null");
			return;
		}
		//出栈的具体操作
		System.out.println(arr[top-1]);
		top--;
		//为节省空间,栈中元素个数少于数组长度的一半时进行数组的缩减(拷贝数组)
		if(top < arr.length/2) {
			int newlen = arr.length/2;
			if(newlen < 20) {
				newlen = 20;
			}
			int[] arrnew = new int[newlen];
			for(int i = 0;i < arrnew.length;i++) {
				arrnew[i] = arr[i];
			}
			arr  = arrnew;
		}
	}

以上便是对栈的进出操作进行的简单实现,后期将实现对栈的增删操作,以及对栈的深入理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值