栈的简单介绍

1、什么是栈

我们用一种最简单的生活常识描述一下,比如我们往柜子里放东西,先放的东西是需要放到柜子最里边,后放的东西在柜子的最外边;如果我们要取东西,先要取柜子最外边的东西,才能取到柜子最里边的东西。这种先进后出,后进先出的结构称为“栈”。
在这里插入图片描述

2、栈的特点

“先进后出,后进先出”

3、栈的操作

栈的操作就两种,分别为出栈和入栈。那我们上边的例子,我们往柜子里放东西的过程称为入栈;我们在柜子里拿东西的过程称为出栈。

注意:柜子只有一个出口和入口,而且出口和入口是一样的。如果两端都有开口,就变成了队列

4、栈的实现

栈的实现主要有两种,一种是数组的实现,叫做顺序栈,另外一种是链表的实现,叫做链式栈

4.1、顺序栈

在这里插入图片描述

基于数组的顺序栈

public class ArrayStack {
   private String[] items;  // 数组
   private int count;       // 栈中元素个数
   private int n;           // 栈的大小

   // 初始化数组,申请一个大小为 n 的数组空间
   public ArrayStack(int n) {
     this.items = new String[n];
     this.n = n;
     this.count = 0;
   }

   /**
    * 功能:入栈
    * 说明:数组入栈的入口为数组尾部
    * @param item :入栈数据元素
    * @return:是否入栈成功
    */
   public boolean push(String item) {
     // 数组空间不够了,直接返回 false,入栈失败。
     if (count == n) return false;
     // 将 item 放到下标为 count 的位置
     items[count] = item;
     //数组长度+1
     ++count;
     //入栈成功
     return true;
   }

   /**
    * 功能:出栈
    * @return:返回出栈元素
    */
   public String pop() {
     // 栈为空,则直接返回 null
     if (count == 0) return null;
     // 返回下标为 count-1 的数组元素
     String tmp = items[count-1];
     //数组长度-1
     --count;
     //返回出栈数据元素
     return tmp;
   }
 }

4.2、链表栈

在这里插入图片描述

/**
 * 功能:基本链表实现栈,入栈、出栈、输出栈
 * @author : 小鹿
 *
 */
 6public class StackBasedLinkedList {
    //定义栈顶指针
    private Node top = null;

    //定义栈结点
    private static class Node {
        //栈结点数据域
        private int data;
        //栈结点指针域
        private Node next;
        //构造函数
        public Node(int data, Node next) {
          this.data = data;
          this.next = next;
        }
        //get 获取数据域方法
        public int getData() {
          return data;
        }
    }

    /**
     * 功能:入栈
     * @param value:要入栈的数据元素
     */
    public void push(int value) {
        //创建一个栈结点 
        Node newNode = new Node(value, null);
        // 判断栈是否为空
        if (top == null) {
          //如果栈为空,就将入栈的值作为栈的第一个元素
          top = newNode;
        } else {
          //否则插入到top栈结点前(所谓的就是单链表的头插法)
          newNode.next = top;
          top = newNode;
        }
    }

    /**
     * 功能 : 出栈
     * @return: -1 为栈中没有数据
     */
    public int pop() {
        // 如果栈的最顶层栈结点为null,栈为空
        if (top == null) return -1;

        //否则执行出栈操作,现将栈顶结点的数据元素赋值给 Value
        int value = top.data;
        //将 top 指针向下移动
        top = top.next;
        //返回出栈的值
        return value;
    }   

    /**
     * 功能:输出栈中所有元素
     */
    public void printAll() {
        //将栈顶指针赋值给p
        Node p = top;
        //循环遍历栈(遍历单链表)
        while (p != null) {
          System.out.print(p.data + " ");
          //指向下一个结点
          p = p.next;
        }
        System.out.println();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值