我们把生活中的栈的概念引入到计算机中,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中, 又可以从栈中出去。 栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出 的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。
-- API设计:
-- 代码:
/**
* 栈
* @param <T>
*/
public class Stack<T> implements Iterable<T> {
// 记录首结点
private Node head;
// 记录栈中元素个数
private int N;
// 构造方法
public Stack() {
head = new Node(null,null);
N = 0;
}
// 判断当前栈中元素个数是否为0
public boolean isEmpty() {
return N == 0;
}
// 获取栈中元素的个数
public int size() {
return N;
}
// 把元素t压入栈中
public void push(T t) {
// 构建新结点,将头结点的下一个变成新结点的下一个
Node newNode = new Node(t,head.next);
// 将头结点的下一个指向变成新结点
head.next = newNode;
// 个数+1
N++;
}
// 弹出栈顶元素
public T pop() {
if(head.next == null) {
// 如果栈没有元素
return null;
}else {
// 要返回的元素
Node oldNode = head.next;
// 将栈顶元素从链表中删除
head.next = head.next.next;
// 个数-1
N--;
return oldNode.item;
}
}
//==============================================================================
// 实现for-each遍历的
@Override
public Iterator<T> iterator() {
return new SIterator();
}
class SIterator implements Iterator<T> {
private Node n = head;
@Override
public boolean hasNext() {
return n.next != null;
}
@Override
public T next() {
n = n.next;
return n.item;
}
}
// 结点类
class Node {
// 存储数据
private T item;
// 下一个结点
private Node next;
// 构造方法
public Node(T item, Node next) {
this.item = item;
this.next = next;
}
}
}
-- 测试代码:
public class StackTest {
public static void main(String[] args) throws Exception {
Stack<String> stack = new Stack<>();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
for (String str : stack) {
System.out.print(str + " ");
}
System.out.println("-----------------------------");
String result = stack.pop();
System.out.println("弹出了元素:" + result);
System.out.println(stack.size());
}
}
-- 运行效果图:
@ 以上内容属于个人笔记