package com.xusheng.stack; /** * 使用链表结构实现栈 * @author xusheng * */ public class MyLinkedStack<T> { private int size; private int modCount; private Node<T> beginMarker; private Node<T> endMarker; private int currentIndex = size; public MyLinkedStack() { doClear(); } private void doClear(){ this.size=0; this.modCount=0; beginMarker = new Node<T>(null,null,null); endMarker = new Node<T>(null,beginMarker,null); beginMarker.next = endMarker; } public int size(){ return this.size; } public T get(int index){ Node<T> n = get(index,0,size); return n.data; } public T pop(){ Node<T> n = get(this.size-1,0,size); T old = n.data; n.prev.next = n.next; n.next.prev = n.prev; this.size--; return n.data; } public void push(T element){ add(size,element); } public void add(int index,T element){ addBefore(get(index,0,size),element); } private void addBefore(Node<T> n,T element){ Node<T> newNode = new Node<T>(element,n.prev,n); n.prev.next = newNode; n.prev = newNode; this.size++; this.modCount++; } private Node<T> get(int index,int low,int upper){ if(index<low || index>upper){ throw new IndexOutOfBoundsException(); } Node<T> p; if(index<(size/2)){ p = beginMarker.next; for(int i=0;i<index;i++){ p = p.next; } }else{ p = endMarker; for(int i=size;i>index;i--){ p = p.prev; } } return p; } private class Node<T>{ private T data; private Node<T> prev; private Node<T> next; public Node(T data, Node<T> prev, Node<T> next) { super(); this.data = data; this.prev = prev; this.next = next; } } }