基于数组实现栈
栈的常用方法
push(E):增加一个元素
pop:弹出一个元素
peek:显示栈顶元素
empty:判空
full:判满
用数组来实现栈,以下代码实现方法
栈后进先出的特点(上子弹)数组尾部添加,尾部删除(头部的的话效率很低)
public class ArrayStack<E> {
private E[] array;
private int top;//栈顶指针
/*
低 顶
0 1 2 3 这样性能更高
a b c d
t 当数组长度与t相等的时候栈已经满了
*/
public ArrayStack(int capacity) {
this.array = (E[]) new Object[capacity];
}
public boolean isEmpty() {
return top == 0;
}
public boolean isfull(){
return top == array.length;
}
public E peek(){
if (isEmpty()){
return null;
}
return array[top - 1];
}
public boolean push(E value){
if (isfull()){
return false;
}
array[top] = value;
top++;
return true;
}
public E pop(){
if (isEmpty()){
return null;
}
return array[--top];
}
//迭代器
public Iterator<E> iterable(){
return new Iterator<E>() {
int p = top;
@Override
public boolean hasNext() {
return p > 0;
}
@Override
public E next() {
E e = array[--p];
return e;
}
};
}
@Override
public String toString() {
return "ArrayStack{" +
"array=" + Arrays.toString(array) +
", top=" + top +
'}';
}
}
基于链表实现栈
先用接口定义了几个方法,再去实现的,这里使用建立的链表是通过了内部类,构造方法也有些不同,这一种也是能够得出结果的,方法的实现并不复杂。这一种构造方法插入节点的时候后一节点没有单独去写一行。
链表是插入头,删除头的特点。
public class LinkedListStack<E> implements Stack<E>,Iterable<E> {
private int capacity;
public LinkedListStack(int capacity) {
this.capacity = capacity;
}
private int size;
private Node<E> head = new Node<>(null,null);
static class Node<E> {
E value;
Node<E> next;
public Node(E value, Node<E> next) {
this.value = value;
this.next = next;
}
}
@Override
public boolean push(E value) {
if (isFull()){
return false;
}
head.next = new Node<>(value, this.head.next);
size++;
return true;
}
@Override
public E pop() {
if (isEmpty()){
return null;
}
Node<E> first = head.next;
head.next = first.next;
size--;
return first.value;
}
@Override
public E peek() {
if (isEmpty()){
return null;
}
return head.next.value;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean isFull() {
return capacity == size;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
Node<E> p = head.next;
@Override
public boolean hasNext() {
return p != null;
}
@Override
public E next() {
E value = p.value;
p = p.next;
return value;
}
};
}
}