欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中基于数据的栈实现

程序员文章站 2022-07-10 20:28:41
...

在java中利用数组来实现栈以及相关操作。

首先我们要新建一个类,该类中new一个固定大小的数组,来充当我们的栈,来容纳入栈的数据。

在该类中我们可以对栈进行出栈入栈,扩容,和获取栈顶元素等操作。在该类中我们使用了泛型

和Object类来创建数组,以便能让我们的栈存放任意类型的一类数据,而不仅仅局限于一种数据

类型。

入栈操作:

在入栈操作时,我们首先会判断栈空间是否足够,若栈已经满了,则我们会动态的增加栈的容量,

然后将push入栈的数据放入数组中。

	public E push(E item) {
		ensureCapacity(size + 1);
		stack[size++] = item;
		return item;
	}

动态增加栈容量:

	/**
	 * 当栈满的时候,对栈进行扩容
	 * */
	private void ensureCapacity(int size) {
		int len = stack.length;
		if(size > len) {		//数组已满
			int newLen = 10;	//每次数组扩充的容量
			stack = Arrays.copyOf(stack, newLen);
		}
	}

出栈操作:

在出栈操作的时候,首先会判断该栈中元素个数是否大于零(即是否是空栈),若是空栈则返回空,

若栈不为空,则返回栈顶数据,并且将出栈的位置置为空。

	public E pop() {
		E e = peek();					//取得栈顶数据
		if(size > 0) {					//检查栈中是否有数据
			stack[size - 1] = null;		//将出栈后的位置置为空
			size--;						//将栈中元素个数减一
		}
		return e;
	}

 

下面是具体实现和测试:

package com.wp.datastruct;

import java.util.Arrays;

/**
 * 使用泛型,以便栈中能够存储我们想要的数据
 * 基于数组的栈实现
 * */
public class MyStack1<E> {

	private Object[] stack;
	private int size;		//栈中元素的个数
	private MyStack1() {
		stack = new Object[10];	//初始长度为10
	}	
	
	//判断栈是否为空
	public boolean isEmpty() {
		return size == 0;
	}
	
	/**
	 * 返回栈顶的一个元素,但是不进行出栈操作
	 * */
	public E peek() {
		if(isEmpty()) {
			return null;
		}
		return (E)stack[size -1];		//返回栈顶元素
	}
	
	public E pop() {
		E e = peek();					//取得栈顶数据
		if(size > 0) {					//检查栈中是否有数据
			stack[size - 1] = null;			//将出栈后的位置置为空
			size--;	
		}
								//将栈中元素个数减一
		return e;
	}
	
	public E push(E item) {
		ensureCapacity(size + 1);
		stack[size++] = item;
		return item;
		
	}
	
	/**
	 * 当栈满的时候,对栈进行扩容
	 * */
	private void ensureCapacity(int size) {
		int len = stack.length;
		if(size > len) {		//数组已满
			int newLen = 10;	//每次数组扩充的容量
			stack = Arrays.copyOf(stack, newLen);
		}
	}
	
	/**
	 * 打印出栈中所有的数据
	 * */
	public void printStack() {
		System.out.println("开始进行出栈:");
		while(size > 0) {
			System.out.println("出栈:" + pop());
		}
		System.out.println("出栈操作结束!");
		
	}
	
    //测试栈操作
	public static void main(String[] args) {
		MyStack1<Integer> stack1 = new MyStack1<>();
		
		stack1.push(1);
		stack1.push(2);
		stack1.push(3);
		
		System.out.println("栈顶元素为:" + stack1.peek());
		
		System.out.println("栈中元素个数为:" + stack1.size);
		stack1.printStack();
		System.out.println("栈中元素个数为:" + stack1.size);
	}	
	
}