当前位置: 首页 > news >正文

数据结构和算法——基于Java——4.1栈(数组实现栈、链表实现栈)

理论补充

在这里插入图片描述

先进后出 FILO(First-Input-Last-Out)的有序列表,限制线性表中元素的插入和删除只能在线性表的同一端进行

  • 栈顶:变化的一端
  • 栈底:固定的一端

代码实现

2.1 数组模拟栈

package com.b0.stack;

import java.util.Scanner;

public class ArrayStackDemo {
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack(5);
        String key = "";
        boolean loop = true;//控制是否退出菜单
        Scanner scanner = new Scanner(System.in);
        while (loop){
            System.out.println("show:表示显示栈");
            System.out.println("exit:退出程序");
            System.out.println("push:入栈");
            System.out.println("pop:出栈");
            System.out.println("请输入你的选择");
            key = scanner.next();
            switch (key){
                case "show":
                    stack.list();
                    break;
                case "push":
                    System.out.println("请输入一个数");
                    int value = scanner.nextInt();
                    stack.push(value);
                    break;
                case "pop":
                    try {
                        int res = stack.pop();
                        System.out.println("出栈数据是:"+res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case "exit":
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出~");
    }
}
class ArrayStack{
    private int maxSize;//栈的大小
    private int[] stack;//数组模拟栈
    private int top = -1;//栈顶,初始化为-1
    //构造器
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[this.maxSize];
    }
    //判断栈满
    public boolean isFull(){
        return top == maxSize-1;
    }
    //栈空
    public boolean isEmpty(){
        return top == -1;
    }
    //入栈
    public void push(int num){
        //判断是否栈满
        if (isFull()){
            System.out.println("栈满");
            return;
        }
        top++;
        stack[top] = num;
    }
    //出栈
    public int pop(){
        //判断是否栈空
        if (isEmpty()){
            //抛出异常
            throw new RuntimeException("栈空,没有数据!");
        }
        int value = stack[top];
        top--;
        return value;
    }
    //遍历栈
    public void list(){
        if (isEmpty()){
            System.out.println("栈空!");
            return;
        }
        while (top != -1){
            //从栈顶开始遍历
            System.out.println(stack[top]);
            top--;
        }
    }
}

2.2 链表模拟栈(头插法)

在这里插入图片描述

package com.b0.stack;

public class LinkedStackDemo {
    public static void main(String[] args) {
        LinkedStack linkedStack = new LinkedStack();
        linkedStack.push(1);
        linkedStack.push(2);
        linkedStack.push(3);
        linkedStack.push(4);
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
    }
}
class LinkedStack{
    //头节点
    Node head = new Node(0);
    //栈空,尾插法
    public boolean isEmpty(){
        return head.next == null;
    }
    //入栈,头插法
    public void push(int num){
        Node node = new Node(num);
        if (isEmpty()){
            head.next = node;
        }
        node.next = head.next;
        head.next = node;
    }
    public int pop(){
        if (isEmpty()){
            //抛出异常
            throw new RuntimeException("栈空,没有数据!");
        }
        //定义零时变量,不修改head指针指向
        Node cur = head;
        int value = cur.next.no;
        cur.next = cur.next.next;
        return value;
    }
}
class Node{
    public int no;
    public Node next;

    public Node(int no) {
        this.no = no;
    }
}

2.3 链表模拟栈(尾插法,不推荐)

package com.b0.stack;

public class LinkedStackDemo {
    public static void main(String[] args) {
        LinkedStack linkedStack = new LinkedStack();
        linkedStack.push(1);
        linkedStack.push(2);
        linkedStack.push(3);
        linkedStack.push(4);
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
        System.out.println("出栈值为:"+linkedStack.pop());
    }
}
class LinkedStack{
    //头节点
    Node head = new Node(0);
    //栈空
    public boolean isEmpty(){
        return head.next == null;
    }
    //入栈
    public void push(int num){
        Node node = new Node(num);
        Node cur = head;
        while (true){
            if (cur.next == null)break;
            cur = cur.next;
        }
        cur.next = node;
    }
    //出栈
    public int pop(){
        if (isEmpty()){
            //抛出异常
            throw new RuntimeException("栈空,没有数据!");
        }
        //定义零时变量,不修改head指针指向
        Node cur = head;
        int value;
        while (true){
            if (cur.next.next == null){
                value = cur.next.no;
                cur.next = null;
                break;
            }
           cur = cur.next;
        }
        return value;
    }
}
class Node{
    public int no;
    public Node next;

    public Node(int no) {
        this.no = no;
    }
}

相关文章:

  • 怎么看网站域名有没有收录 收录情况怎么样 网站收录查询
  • 信号发生器不会用?一篇文章教会你
  • Java+JSP+MySQL基于SSM的医院挂号就诊系统-计算机毕业设计
  • 今年十八,喜欢ctf-web
  • AI加速(九): 深度理解吞吐量和延时
  • java毕业设计的滑雪场学具租赁管理系统mybatis+源码+调试部署+系统+数据库+lw
  • redis5.0集群搭建(两台服务器)
  • [操作系统笔记]基本分页存储管理
  • 容器运行时与k8s概述
  • [ Linux ] Linux信号概述 信号的产生
  • 终极版Facebook广告管理工具新手教程!赶紧收藏!(下篇)
  • 计算机组成原理习题课第四章-2(唐朔飞)
  • Spring Boot 配置多数据源
  • HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
  • 隔离放大器
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 11111111
  • 3.7、@ResponseBody 和 @RestController
  • CentOS 7 防火墙操作
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ES6简单总结(搭配简单的讲解和小案例)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • MQ框架的比较
  • overflow: hidden IE7无效
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue 重置组件到初始状态
  • 从零开始的无人驾驶 1
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 记录一下第一次使用npm
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 我的业余项目总结
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 数据结构
  • #HarmonyOS:Web组件的使用
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)scrum常见工具列表
  • .NET 4.0中的泛型协变和反变
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net环境下的缓存技术介绍
  • .net开发时的诡异问题,button的onclick事件无效
  • .net中调用windows performance记录性能信息
  • .py文件应该怎样打开?
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • []Telit UC864E 拨号上网
  • [Asp.net mvc]国际化