定义
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
代码实现
链表实现
public class Stack<Item> {
private Node first; // 栈顶(最近添加的元素)
private int N; // 元素数量
/**
* 返回栈是否为空
* @return true 栈为空, false 栈不为空。
*/
public boolean isEmpty() {
return N == 0;
}
/**
* 返回栈内元素数目
* @return 栈内元素数目
*/
public int size() {
return N;
}
/*
* 添加元素到栈
* @param item 添加的元素
*/
public void push (Item item) {
Node oldNode = first;
first = new Node();
first.data = item;
first.next = oldNode;
N++;
}
/*
* 从栈顶移除元素
* return 移除的元素
*/
public Item pop() {
Item item = first.data;
first = first.next;
N--;
return item;
}
// 定义了节点的内部类
private class Node {
Item data;
Node next;
}
public static void main(String[] args) {
Stack<String> s = new Stack()<String>;
System.out.println(s.isEmpty());
s.push("hhhhh");
System.out.println(s.first.data);
}
}
数组实现
public class Stack<Item> {
private item[] a = (Item[]) new Object[1]; // 存储栈内元素
private int N; // 栈内元素数目
/*
* 返回栈是否为空
* @return true 栈为空,false 栈不为空。
*/
public boolean isEmpty() {
return N == 0;
}
/**
* 返回栈内元素数目
* @return 栈内元素数目
*/
public int size() {
return N;
}
/*
* 添加元素到栈
* @param item 添加的元素
*/
public void push (Item item) {
if (N == a.length) {
resize(2 * a.length);
}
a[++N] = item;
}
/*
* 从栈顶移除元素
* return 移除的元素
*/
public Item pop() {
Item item = a[--N];
a[N] == null;
if (N > 0 && N == a.length / 4) {
resize(a.length / 2);
}
return item;
}
/**
* 重置数组大小
* @param max 重置的数组大小
*/
public void resize(int max) {
// 将栈移动到一个新数组
Item[] temp = (Item[]) new Object[max];
for (int i = 0; i < N; i++) {
temp[i] = a[i];
a = temp;
}
}
public static void main(String[] args) {
Stack<String> s = new Stack()<String>;
System.out.println(s.isEmpty());
s.push("hhhhh");
System.out.println(s.a[0]);
}
}