• 栈的抽象类型描述(ADT):

    public interface Stack {
        // Stack values are stacks whose elements are arbitrary objects.
        // 栈元素类型为任意对象
        
        //Modifiers 修改器--修改栈
        public void clear();
        public void push(Object obj);
        public Object pop();    // 删除并返回栈顶元素
        
        //Accessors 访问器--获取栈信息
        public boolean isEmpty();
        public int size();
        public Object peek();    // 返回栈顶元素
        
    }

    栈的数组实现:

    // 数组实现栈
    public class ArrayStack implements Stack {
        
        private static final int DEFAULT_SIZE = 10;        // 指定--默认栈深度
        private Object[] array;
        private int top;    // 指向栈顶指针/游标
        
    //    public ArrayStack(){}
        
        public ArrayStack() {    // 初始化
            array = new Object[DEFAULT_SIZE];
            top = 0;
        }
    
        @Override
        public void clear() {
            for(int i = 0; i < top; i++) {
                array[i] = null;
            }
    //        for(Object i:array) {
    //            i = null;
    //        }
            top = 0;
        }
    
        @Override
        public boolean isEmpty() {
            return top == 0;
        }
    
        @Override
        <span style="color:#660cc;">public Object peek() {
            if (top == 0) {    // 操作空栈时抛出异常,异常可以自己编写(只要继承Exception)
                throw new IllegalStateException();
            }        
            return array[top - 1];
        }</span>
    
        @Override
        <span style="color:#660cc;">public Object pop() {
            if (top == 0) {
                throw new IllegalStateException();
            }
            Object obj = array[--top];
            array[top] = null;
            return obj;
        }</span>
    
        @Override
        public void push(Object obj) {
            if(top == array.length) {
                expand();
            }
            array[top ++] = obj;    // 只能向栈顶插入数据
        }
    
        @Override
        public int size() {
            return top;
        }
    
        private void expand() {        // 辅助方法,数组长度加倍
            Object[] newArray = new Object[2*array.length];
            for(int i = 0; i < array.length; i++) {
                newArray[i] = array[i];
            }
            array = newArray;
        }
        
        public String toString() {
    //        StringBuilder str = new StringBuilder();
            String buf = "[ ";
            for (int i = 0; i < top; i++) {
                if(i > 0) {          // 在每个元素后面加“,”分隔
                    buf += ", ";
                }
                buf += array[i];
            }
            buf += " ]";
            return buf;
        }
    
    }

     

    栈--链表实现:

    public class LinkedStack implements Stack {
    
        // 链表节点类
        private static class SLLNode {
            private Object data;
            private SLLNode next;
    
            public SLLNode() {
    
            }
    
            public SLLNode(Object data) {
                this.data = data;
            }
    
            public SLLNode(Object data, SLLNode next) {
                this.data = data;
                this.next = next;
            }
    
            public Object getData() {
                return data;
            }
    
            public void setData(Object data) {
                this.data = data;
            }
    
            public SLLNode getNext() {
                return next;
            }
    
            public void setNext(SLLNode next) {
                this.next = next;
            }
    
            public String toString() {
                return data.toString();
            }
        }
    
        private SLLNode top;
        private int count;
    
        public LinkedStack() {        // 初始化 空栈,栈深度任意
            clear();
        }
    
        @Override
        public void clear() {
            top = null;
            count = 0;
        }
    
        @Override
        public boolean isEmpty() {
            return top == null;
        }
    
        @Override
        public Object peek() {
            if (top == null) {
                throw new IllegalStateException();
            }
            return top.data;
        }
    
        @Override
        public Object pop() {
            if (top == null) {
                throw new IllegalStateException();
            }
            Object val = top.data;
            top = top.next;
            count--;
            return val;
        }
    
        @Override
        public void push(Object obj) {
            top = new SLLNode(obj, top);
            count++;
        }
    
        @Override
        public int size() {
            return count;
        }
    
        public String toString() {
            String buf = "[ ";
            for (SLLNode curr = top; curr != null; curr = curr.next) {
                if (curr != top) {
                    buf += ", ";
                }
                buf += curr.data;
            }
            buf += " ]";
            return buf;
        }
    }

    测试类:

    public class ArrayStackTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Stack stack = new ArrayStack();
            stack.push("Array");
            stack.push("Number");
            stack.push("String");
            stack.push("Object");
            System.out.println("栈顶:" + stack.peek().toString());
            System.out.println(stack.toString());
    //        System.out.println("删除栈顶后:" + stack.pop().toString());
    //        System.out.println(stack.toString());
    //        stack.clear();
            System.out.println(stack.size());
            System.out.println(stack.isEmpty());
            System.out.println(stack.toString());
        }
    
    }

     

  • 相关阅读:
    继续学习:C语言关键字
    继续学习C:运算符
    C语言小程序(八)、统计字母个数
    C语言小程序(七)、石头剪刀布
    飞思卡尔总结
    [原]NYOJ-子串和44
    C++函数重载详解
    趣味Shell
    C语言小程序(六)、数组操作
    C语言小程序(五)、数组查询
  • 原文地址:https://www.cnblogs.com/zhangpeng201211/p/2410974.html
Copyright © 2020-2023  润新知