1、什么是栈
栈(Stack)是一种线性存储结构,它具有如下特点:
(1)栈中的数据元素遵守”先进后出”(First In Last Out)的原则,简称FILO结构。
(2)限定只能在栈顶进行插入和删除操作。
2、栈的基本操作
栈主要有以下几种基本操作:
(1)empty(): 如果栈为空返回true,否则返回false;
(2)size(): 返回栈内元素的大小;
(3)push(): 向栈内压入一个成员;
(4)pop(): 从栈顶弹出一个成员;
3、具体代码(我们使用链表来完成基本操作,并且使用java迭代器的功能)
package cn.itcast.algorithm.stack;
import java.util.Iterator;
public class Stack<T> implements Iterable<T>{
//首结点
private Node head;
//栈中元素的个数
private int N;
public class Node{
T data;
Node next;
public Node(T data,Node next){
this.data=data;
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 first=head.next;
Node newNode = new Node(t, null);
//首结点指向新结点
head.next=newNode;
//新结点指向原来的第一节点first
newNode.next=first;
//元素个数加1
N++;
}
//把元素弹出栈
public T pop(){
//找到首结点的下一个结点
Node first=head.next;
if(first==null){
return null;
}
head.next=first.next;
//元素个数-1
N--;
return first.data;
}
@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.data;
}
}
}
测试代码
package cn.itcast.algorithm.stackTest;
import cn.itcast.algorithm.stack.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");
for(String s:stack){
System.out.println(s);
}
System.out.println("----------------");
//测试出栈
String s1=stack.pop();
System.out.println("弹出元素:"+s1);
System.out.println("剩余元素个数:"+stack.size());
}
}
测试结果