3.2_栈_链式存储结构(链表形式)

【链式存储结构】

栈的链式存储结构,简称链栈。

 

【具体实现】

package com.Higgin.LinkStack;

import java.util.EmptyStackException;

/**
 *  使用链表的形式实现栈
 */
public class MyStack {
    /**
     * 结点内部类
     */
    class Node{
        private Object obj;     //数据域
        private Node next;     //指针域
        public Node(Object obj, Node next) {
            this.obj = obj;
            this.next = next;
        }
        public Node(Object obj){
            this(obj,null);
        }
        public Node(){
            this(null,null);
        }
    }
    
    private Node top;  //栈顶指针
    private int count; //栈含有的对象数量
    
    public MyStack(){
        this.top=new Node();
        this.count=0;
    }
    /**
     * 返回栈中的已存的元素个数
     */
    public int size(){
        return this.count;
    }
    /**
     *  判断是否为空栈
     */
    public boolean empty(){
        return count==0;
    }
    /**
     * 插入对象obj为新的栈顶对象
     */
    public void push(Object obj){
        Node newNode=new Node(obj);
        newNode.next=top;  //把当前的栈顶元素赋值给新结点的直接后继
        top=newNode;       //然后将新结点newNode赋值给栈顶指针
        this.count++;
    }
    
    /**
     * 获取栈顶的节点
     */
    public Node peekNode(){
        if(size()==0){
            throw new EmptyStackException();
        }
        return top;
    }
    
    /**
     *  获取栈顶元素,但不删除
     */
    public Object peek(){
        if(size()==0){
            throw new EmptyStackException();
        }
        return top.obj;
    }
    
    /**
     * 出栈,返回被弹出的节点的数据域对象
     */
    public Object pop(){
        Object oldObj=peek();  //获取栈顶 里面包含了是否为空栈的判断
        Node oldNode=top;
        top=top.next;
        this.count--;
        oldNode.obj=null;
        oldNode.next=null;
        return oldObj;
    }
    
    /**
     * 查找对象的位置,查找的是pop返回1,没有0
     */
    public int search(Object obj){
        if(size()==0){
            throw new EmptyStackException();
        }
        Node curNode=top;
        int i=1;
        while(curNode.next!=null){
            if(obj.equals(curNode.obj)){
                return i;
            }
            curNode=curNode.next;
            i++;
        }
        return -1;
    }
}

【测试】

package com.Higgin.LinkStack;

public class TestMyStack {
    public static void main(String[] args) {
        MyStack ms=new MyStack();
        System.out.println("是否为空==="+ms.empty());                //true
        ms.push(11);
        ms.push(22);
        ms.push(33);
        System.out.println("最近一次添加的是33==="+ms.peek());         //33
        ms.push(44);
        ms.push(55);
        System.out.println("最近一次添加的是55==="+ms.peek());         //55
        System.out.println("寻找22的位置==="+ms.search(22));          //4
        ms.push(22);
        System.out.println("寻找22的位置==="+ms.search(22));          //1
        System.out.println("寻找55的位置==="+ms.search(55));          //1
        System.out.println("寻找99的位置(不存在)==="+ms.search(99));   //-1
        ms.pop(); 
        System.out.println("执行了一次pop,栈顶的元素==="+ms.peek());  //44
        System.out.println("栈移除了之后的长度为===="+ms.size());      //4
    }
}

【运行结果】

 

posted @ 2016-11-25 15:11  HigginCui  阅读(506)  评论(0编辑  收藏  举报