栈的实现-----java

1、顺序栈的实现
import java.util.Arrays;
public class SequenceStack<T> {
	
	private int DEFAULT_SIZE = 10;
	
	// 保存数组的长度。
	private int capacity;
	
	// 定义当底层数组容量不够时,程序每次增加的数组长度
	private int capacityIncrement = 0;
	
	// 定义一个数组用于保存顺序栈的元素
	private Object[] elementData;
	
	// 保存顺序栈中元素的当前个数
	private int size = 0;

	// 以默认数组长度创建空顺序栈
	public SequenceStack() {
		capacity = DEFAULT_SIZE;
		elementData = new Object[capacity];
	}

	// 以一个初始化元素来创建顺序栈
	public SequenceStack(T element) {
		this();
		elementData[0] = element;
		size++;
	}

	/**
	 * 以指定长度的数组来创建顺序栈
	 * 
	 * @param element
	 *            指定顺序栈中第一个元素
	 * @param initSize
	 *            指定顺序栈底层数组的长度
	 */
	public SequenceStack(T element, int initSize) {
		this.capacity = initSize;
		elementData = new Object[capacity];
		elementData[0] = element;
		size++;
	}

	/**
	 * 以指定长度的数组来创建顺序栈
	 * 
	 * @param element
	 *            指定顺序栈中第一个元素
	 * @param initSize
	 *            指定顺序栈底层数组的长度
	 * @param capacityIncrement
	 *            指定当顺序栈底层数组的长度不够时,底层数组每次增加的长度
	 */
	public SequenceStack(T element, int initSize, int capacityIncrement) {
		this.capacity = initSize;
		this.capacityIncrement = capacityIncrement;
		elementData = new Object[capacity];
		elementData[0] = element;
		size++;
	}

	// 获取顺序栈的大小
	public int length() {
		return size;
	}

	// 入栈
	public void push(T element) {
		ensureCapacity(size + 1);
		elementData[size++] = element;
	}

	// 很麻烦,而且性能很差
	private void ensureCapacity(int minCapacity) {
		// 如果数组的原有长度小于目前所需的长度
		if (minCapacity > capacity) {
			if (capacityIncrement > 0) {
				while (capacity < minCapacity) {
					// 不断地将capacity长度加capacityIncrement,
					// 直到capacity大于minCapacity为止
					capacity += capacityIncrement;
				}
			} else {
				// 不断地将capacity * 2,直到capacity大于minCapacity为止
				while (capacity < minCapacity) {
					capacity <<= 1;
				}
			}
			elementData = Arrays.copyOf(elementData, capacity);
		}
	}

	// 出栈
	public T pop() {
		T oldValue = (T) elementData[size - 1];
		// 释放栈顶元素
		elementData[--size] = null;
		return oldValue;
	}

	// 返回栈顶元素,但不删除栈顶元素
	public T peek() {
		return (T) elementData[size - 1];
	}

	// 判断顺序栈是否为空栈
	public boolean empty() {
		return size == 0;
	}

	// 清空顺序栈
	
	public void clear() {
		// 将底层数组所有元素赋为null
		Arrays.fill(elementData, null);
		size = 0;
	}
	
	@Override
	public String toString() {
		if (size == 0) {
			return "[]";
		} else {
			StringBuilder sb = new StringBuilder("[");
			for (int i = size - 1; i > -1; i--) {
				sb.append(elementData[i].toString() + ", ");
			}
			int len = sb.length();
			return sb.delete(len - 2, len).append("]").toString();
		}
	}
	
		public static void main(String[] args) {
			SequenceStack<String>  stack =new SequenceStack<String>();
			stack.push("aaa");
			stack.push("bbb");
			stack.push("ccc");
			stack.push("ddd");
			System.out.println(stack);
			
			System.out.println(stack.peek());
			System.out.println(stack.pop());
			System.out.println(stack.pop());
			System.out.println(stack);

		}
}

2、链栈的实现

public class LinkStack<T> {
	
	
	// 定义一个内部类Node,Node实例代表链栈的节点。
	private class Node {
		// 保存节点的数据
		private T data;
		// 指向下个节点的引用
		private Node next;

		// 无参数的构造器
		public Node() {
		}

		// 初始化全部属性的构造器
		public Node(T data, Node next) {
			this.data = data;
			this.next = next;
		}
	}

	// 保存该链栈的栈顶元素
	private Node top;
	// 保存该链栈中已包含的节点数
	private int size;

	// 创建空链栈
	public LinkStack() {
		// 空链栈,top的值为null
		top = null;
	}

	// 以指定数据元素来创建链栈,该链栈只有一个元素
	public LinkStack(T element) {
		top = new Node(element, null);
		size++;
	}

	// 返回链栈的长度
	public int length() {
		return size;
	}

	// 进栈
	public void push(T element) {
		// 让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
		top = new Node(element, top);
		size++;
	}

	// 出栈
	public T pop() {
		Node oldTop = top;
		// 让top引用指向原栈顶元素的下一个元素
		top = top.next;
		// 释放原栈顶元素的next引用
		oldTop.next = null;
		size--;
		return oldTop.data;
	}

	// 访问栈顶元素,但不删除栈顶元素
	public T peek() {
		return top.data;
	}

	// 判断链栈是否为空栈
	public boolean empty() {
		return size == 0;
	}

	// 清空链栈
	public void clear() {
		// 将底层数组所有元素赋为null
		top = null;
		size = 0;
	}

	public String toString() {
		// 链栈为空链栈时
		if (empty()) {
			return "[]";
		} else {
			StringBuilder sb = new StringBuilder("[");
			for (Node current = top; current != null; current = current.next) {
				sb.append(current.data.toString() + ", ");
			}
			int len = sb.length();
			return sb.delete(len - 2, len).append("]").toString();
		}
	}
	
	public static void main(String[] args) {
		LinkStack<String> stack = new LinkStack<String>();
		stack.push("aaaa");
		stack.push("bbbb");
		stack.push("cccc");
		stack.push("dddd");
		System.out.println(stack);
		System.out.println(stack.peek());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack);

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值