美文网首页
栈的实现

栈的实现

作者: wisdom1991 | 来源:发表于2017-10-30 15:03 被阅读0次

基于顺序表的栈实现:

package StackExercise;

public class MyStack<T> {
    // 最大尺寸
    public static final int MAXSIZE = 20;

    // 顶端
    private int top;
    // 所有的栈
    private Object[] objs;
    // 栈的最大值
    private int max;

    // 初始化
    public MyStack() {
        this(MyStack.MAXSIZE);
    }

    public MyStack(int size) {
        if (size <= 0) {
            throw new RuntimeException("初始化栈必须大于0!" + size);
        } else {
            objs = new Object[size];
            top = -1;
            max = size;
        }
    }

    // 压入元素
    public void push(T t) {
        if (top == max - 1) {
            throw new RuntimeException("栈以满!");
        } else {
            objs[++top] = t;
        }
    }

    // 弹出顶部元素
    public T pop() {
        if (top == -1) {
            throw new RuntimeException("栈为空!");
        } else {
            T ret = (T) objs[top];
            objs[top--] = null;
            return ret;
        }
    }

    // 是否为空
    public boolean isEmpty() {
        return top == -1;
    }

    // 是否满
    public boolean isFull() {
        return top == max - 1;
    }

    // 查看顶部元素,不弹出
    public T peek() {
        if (top == -1) {
            throw new RuntimeException("栈为空!");
        } else {
            return (T) objs[top];
        }

    }

    public void print() {
        for (int i = 0; i <= top; i++) {
            System.err.println(objs[i]);
        }
    }
}

测试代码:

package StackExercise;

public class Main {
    public static void main(String[] args) {
        MyStack<Integer> t = new MyStack<Integer>();
        for (int i = 0; i < 10; i++) {
            t.push(i);
        }
        t.print();
        for (int i = 0; i < 3; i++) {
            t.pop();
        }
        t.print();
    }
}

基于顺序表的链表实现:

package StackExercise;

public class LinkedStack<T> {
    // 最大尺寸
    public static final int MAXSIZE = 20;
    // 所有的栈
    public LinkedStackData<T> head;
    // 栈的顶端
    public int top;
    // 栈的最大值
    public int max;

    // 初始化
    public LinkedStack() {
        this(LinkedStack.MAXSIZE);
    }

    public LinkedStack(int size) {
        if (size <= 0) {
            throw new RuntimeException("初始化栈必须大于0!" + size);
        } else {
            head = new LinkedStackData<T>();
            top = -1;
            max = size;
        }
    }

    // 是否为空
    public boolean isEmpty() {
        return top == -1;
    }

    // 是否满
    public boolean isFull() {
        return top == max - 1;
    }

    // 查看顶部元素,不弹出
    public T peek() {
        if (top == -1) {
            throw new RuntimeException("栈为空!");
        } else {
            return (T) (findTop().data);
        }
    }

    // 弹出顶部元素
    public T pop() {
        T ret = null;
        if (top == -1) {
            throw new RuntimeException("栈为空!");
        } else {
            LinkedStackData<T> tData = head;
            while (tData.next != null) {
                if (tData.next.next == null) {
                    ret = tData.next.data;
                    tData.next = null;
                    break;
                }
                tData = tData.next;
            }
        }
        return ret;
    }

    // 压入元素
    public void push(T t) {
        if (top == max - 1) {
            throw new RuntimeException("栈以满!");
        } else {
            LinkedStackData<T> newData = new LinkedStackData<T>();
            newData.data = t;
            LinkedStackData<T> topData = findTop();
            topData.next = newData;
            top++;
        }
    }

    // 寻找顶部元素
    private LinkedStackData<T> findTop() {
        LinkedStackData<T> tData = head;
        while (tData.next != null) {
            tData = tData.next;
        }
        return tData;
    }

    // 打印
    public void print() {
        LinkedStackData<T> i = head;
        while (i.next != null) {
            i = i.next;
            System.err.println(i.data);
        }
        
    }
}

基础数据类:

package StackExercise;

public class LinkedStackData<T> {
    // 下一个
    public LinkedStackData<T> next;
    // 当前数据
    public T data;
}

测试代码:

package StackExercise;

public class Main {
    public static void main(String[] args) {

        LinkedStack<Integer> t = new LinkedStack<Integer>();
        for (int i = 0; i < 10; i++) {
            t.push(i);
        }
        t.print();
        for (int i = 0; i < 3; i++) {
            t.pop();
        }
        t.print();
    }
}

以为这个会比链表东西会多一些,但是写起来感觉比链表好像要简单,也可能是方法少,但是理解起来可能对新手有一些难度吧。

相关文章

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • Swift 队列&栈 相关操作

    栈 LIFO(后进先出) 队列 FIFO(先进先出) 队列与栈相互的实现 栈 - 队列实现 队列 - 栈实现 相关...

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 2018-07-09顺序表实现栈

    栈的实现 ——直接用顺序表(列表list)进行 栈结构实现 栈可以用顺序表实现,也可以用链表实现。 栈的操作 St...

  • 38_两个有趣的问题

    关键词:通过栈实现队列、通过队列实现栈 0. 通过栈实现队列 用栈实现队列等价于用后进先出的特性实现先进先出的特性...

  • 栈 Python实现

    栈的顺序表实现 栈的链接表实现

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 3. 栈的操作

    1. 栈的操作-c语言实现2. 栈操作的实现-顺序栈和链栈 3. 栈的实现与遍历4. c语言的函数调用栈5. 两个...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

网友评论

      本文标题:栈的实现

      本文链接:https://www.haomeiwen.com/subject/skwppxtx.html