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 Stackimplements Iterable { //首结点 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 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 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());
}
}
测试结果



