栈的基本概念
栈是一种先进后出的数据结构(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个弹出来)。
我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。
代码实现
package linear;
import java.util.Iterator;
public class Stack<T> implements Iterable<T>{
//记录首节点
private Node head;
//栈中元素个数
private int N;
private class Node{
public T item;
public Node next;
private Node(T item,Node next){
this.item = item;
this.next = next;
}
}
public Stack(){
this.head = new Node(null,null);
this.N = 0;
}
//判断当前栈中元素个数是否为0
public boolean isEmpty(){
return N==0;
}
//获取栈中元素个数
public int size(){
return N;
}
//把t元素压入栈
public void push(T t){
Node oldFirst = head.next;
Node newNode = new Node(t,null);
head.next = newNode;
newNode.next = oldFirst;
N++;
}
//弹出栈顶元素
public T pop(){
Node oldFirst = head.next;
if (oldFirst==null){
return null;
}
head.next = oldFirst.next;
N--;
return oldFirst.item;
}
@Override
public Iterator<T> iterator() {
return new SIterator();
}
private class SIterator implements Iterator{
private Node n;
public SIterator(){
this.n = head;
}
@Override
public boolean hasNext() {
return n.next!=null;
}
@Override
public Object next() {
n = n.next;
return n.item;
}
}
}
package test;
import linear.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
stack.push("e");
for(String item : stack){
System.out.println(item);
}
String result = stack.pop();
System.out.println("弹出的元素是:" + result);
for(String item : stack){
System.out.println(item);
}
System.out.println("剩余的元素个数是:" + stack.size());
}
}