【数据结构与算法】-- 4. 如何实现一个栈(顺序栈和链式栈)

栈的操作特性上来看, 栈是一种“操作受限”的线性表, 只允许在一端插入和删除数据。

当某个数据集合只涉及在一端插入和删除数据, 并且满足后进先出、 先进后出的特性, 我们就应该
首选“栈”这种数据结构。

如何实现一个栈?
实际上, 栈既可以用数组来实现, 也可以用链表来实现。 用数组实现的栈, 我们叫作顺序栈, 用链表实现的栈, 我们叫作链式栈。

顺序栈

package com.anomalous.array;

/**
 * 基于数组实现的顺序栈
 *
 * @author 天赋吉运-杨晓慧
 * @create 2019-04-27 11:42
 */
public class ArrayStack {

    // 定义数组,栈中元素个数,栈的大小
    private String[] items;  // 数组
    private int count;   // 栈中元素个数
    private int n;       // 栈的大小

   // 通过构造函数初始化数组
    public ArrayStack(int n ){
        // 申请一个长度为n的数组
        this.items=new String[n];
        this.n=n;
        this.count=0; // 栈中元素为0--空的栈
    }


    /**
     * 入栈操作
     * @param item 要入栈的元素
     * @return 是否入栈成功
     */
    public boolean inStack(String item){
        // 判断栈内元素的数量是否已经到达数组的最大长度
        if (count==n) {
            // 栈已满,入栈失败
            return false;
        }
        // 入栈,将item放置在下标为count的位置
        items[count]=item;

        // 栈内元素数量+1;
        ++count;

        // 入栈成功
        return true;
    }


    /**
     * 出栈操作
     * @return 出栈的元素
     */
    public String outStack(){
        // 判断是否是空栈,
        if (this.count==0) {
            // 空栈,返回null
            return null;
        }

        // 将栈中最后一个下标的元素移除 (总共有count个元素,最后一个元素的下标为count-1)
        String temp=this.items[count-1];

        // 栈中元素的数量减一
        --count;
        // 返回出栈的元素
        return temp;
    }

}


链式栈

下面是链式栈的实现

/**
 * 基于链表实现的链式栈
 *
 * @author 天赋吉运-杨晓慧
 * @create 2019-04-30 8:35
 */
public class LinkedListStack {

    // 定义栈顶节点(入栈出栈都从栈顶)
    private Node top = null;

    /**
     * 入栈操作
     * @param value 入栈的data
     * @return 是否入栈成功
     */
    public void pushStack(int value){

        // 初始化入栈的节点
        Node newNode=new Node(value,null);

        // 判断栈是否为空
        if (top==null) {
            // 栈为空,直接入栈
            top=newNode;
        } else{
            // 栈不为空,将待入节点next指向null
            newNode.next=top;
            // 然后放入栈顶
            top=newNode;
        }
    }


    /**
     * 出栈操作
     * @return 栈顶节点出栈(-1表示栈为空)
     */
    public int popStack(){
        // 判断栈是否为空
        if (top==null) {
            // 栈为空,出栈失败
            return -1;
        }else{
            // 取出栈顶节点值
            int value =top.data;

            // 栈顶节点指针下移一位
            top=top.next;
            // 返回栈顶节点
            return value;
        }
    }

    /**
     * 输出链表
     */
    private void printStack(){
        // 取到栈顶节点
        Node n =top;
        if (n!=null) {
            // 栈顶节点不为空
            System.out.print(n.data+"--");
            // 栈顶指针下移
            n =n.next;
        }
        System.out.println();
    }

    /**
     * 定义链表结构
     */
    public static class Node{
        private int data;
        private Node next;

        private Node(int data,Node next){
            this.data=data;
            this.next=next;
        }

        public int getData() {
            return data;
        }
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页