Java自定义栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQB67G8COM/article/details/89463023

前言:以下为自主设计栈,供理解用
栈接口:

package DataStructure.stacks;

import java.util.List;

public interface IStack<E> {
	
	//1.判断空栈
	public boolean isEmpty();
	
	
	//2.判断栈满,链栈始终为false,除非虚拟机栈内存耗尽
	public boolean isMax();
	
	//3.入栈
	public boolean push(E e);

	//4.出栈
	public E pop();
	
	//5.返回栈顶
	public E peek();
	
	/**
	 * 6.返回栈元素在栈中的位置
	 * OrderStack:返回栈元素在栈中的位置,栈底元素位置为0,
	 * LinkedStack:返回栈元素在栈中的位置,栈底元素位置为0
	 * @param e
	 * @return
	 */
	public int getIndex(E e);
	
	//7.返回栈的实际长度
	public int size();
	
	//8.返回栈容量,链栈因为是动态扩容,实际长度等于栈大小
	public int getStackSize();
	
	//9.打印栈
	public List<E> display();
}

顺序栈:

	package DataStructure.stacks;

import java.util.ArrayList;
import java.util.List;

/**
 * 	顺序栈
 *
 * @class DataStructure.stacks.OrderStack
 * @author ljj
 * @date 2019-04-22
 * @notes
 * 
 * @param <E>
 */
public class OrderStack<E> implements IStack<E> {
	private	Object[] data = null; //数据栈
	private int top = -1;		  //栈顶指针初始化为-1
	private int maxSize = 0;	  //栈最大容量
	
	//默认设置栈容量为10
	public OrderStack() {
		this(10);
	}
	
	public OrderStack(int initialSize) {
		if (initialSize >= 0) {
			this.data = new Object[initialSize];//初始化数组
			this.maxSize = initialSize;			//设置栈最大容量
			this.top = -1;
		}
	}
	
	@Override
	public boolean isEmpty() {
		return top == -1 ? true : false;	//根据栈顶来判断栈是否为空
	}
	
	@Override
	public boolean isMax() {
		return top >= maxSize-1 ? true : false; //判断是否满栈
	}
	
	@Override
	public boolean push(E e) {
		if (isMax()) {
			System.err.println("栈已满");
			return false;
		}
		data[++top] = e;//将元素添加到列表中
		return true;
	}

	@Override
	@SuppressWarnings("unchecked")
	public E pop() {
		if (isEmpty()) {
			System.out.println("空栈");
			return null;
		}
		return (E)data[top--];
	}

	@Override
	@SuppressWarnings("unchecked")
	public E peek() {
		if (isEmpty()) {
			System.err.println("栈空");
			return null;
		}
		return (E)data[top];
	}

	//获取元素在栈中的位置
	@Override
	@SuppressWarnings("unchecked")
	public int getIndex(E e) {
		for(int index = top; index != -1; index--) {
			if (((E)data[index]).equals(e)) {
				return index;
			}
		}
		return -1;
	}
	
	//栈元素个数
	@Override
	public int size() {
		return this.top+1;	//栈顶值,为栈元素的实际个数
	}
	
	//栈大小
	@Override
	public int getStackSize() {
		return this.maxSize;
	}
	
	//打印栈元素
	@Override
	@SuppressWarnings("unchecked")
	public List<E> display() {
		List<E> list = new ArrayList<>();
		for(int index = top; index != -1; index--) {
			list.add((E)data[index]);
		}
		return list;
	}
}

链栈:

package DataStructure.stacks;

import java.util.ArrayList;
import java.util.List;

public class LinkedStack<E> implements IStack<E> {
	
	private Node top = null;	//定义栈顶
	private int	size = 0;		//定义栈节点数量
	
	//内部节点类
	private class Node {
		public Object data = null;	//数据域
		public Node next = null;	//指针域
		
		public Node(Object data, Node next) {
			this.data = data;
			this.next = next;
		}

		@Override
		public String toString() {
			return "Node [data=" + data + ", next=" + next + "]";
		}
	}
	
	@Override
	public boolean isEmpty() {
		return size == 0 ? true : false;
	}
	
	@Override
	public boolean isMax() {
		return false;
	}
	
	//压栈
	@Override
	public boolean push(E e) {
		top = new Node(e, top);
		size++;
		return true;
	}
	
	//出栈
	@Override
	@SuppressWarnings("unchecked")
	public E pop() {
		if (isEmpty()) {
			System.err.println("空栈");
			return null;
		}
		Node temp = top;
		top = top.next;
		temp.next = null;	//释放引用,删除指针指向(如果没有释放引用GC不会对对象进行回收)
		size--;
		return (E)temp.data;
	}

	@Override
	@SuppressWarnings("unchecked")
	public E peek() {
		return (E)this.top.data;
	}

	@Override
	@SuppressWarnings("unchecked")
	public int getIndex(E e) {
		Node tmp = top;
		for(int index = 0; tmp != null; index++) {
			if (((E)tmp.data).equals(e)) 
				return size-(index+1);		
			tmp = tmp.next;
		}
		return -1;
	}
	
	//返回栈大小
	@Override
	public int size() {
		return this.size;
	}

	@Override
	public int getStackSize() {
		return this.size;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<E> display() {
		List<E> list = new ArrayList<>();
		Node tmp = top;
		while(tmp != null) {
			list.add((E)tmp.data);
			tmp = tmp.next;
		}
		return list;
	}	
}

测试Demo:

void OrderStackDemo(){
		IStack<Integer> iStack = new OrderStack<>();
		for(int i = 0;i < 9;i++) {
			iStack.push(i);
		}
		System.out.println("index:"+iStack.getIndex(4)+"    栈大小:"
				+iStack.getStackSize()+" 是否最大值:"+iStack.isMax());
		System.out.println(iStack.display());
	}
	
	void LinkedStackDemo() {
		IStack<Integer> iStack = new LinkedStack<>();
		for(int i = 0;i < 9;i++) {
			iStack.push(i);
		}
		System.out.println("index:"+iStack.getIndex(4)+"    栈大小:"
				+iStack.getStackSize()+" 是否最大值:"+iStack.isMax());
		System.out.println(iStack.display());
	}

Console:

----------OrderStack------------
index:4    栈大小:10 是否最大值:true
栈已满
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
----------LinkedStack------------
index:4    栈大小:9 是否最大值:false
[8, 7, 6, 5, 4, 3, 2, 1, 0]

猜你喜欢

转载自blog.csdn.net/QQB67G8COM/article/details/89463023