IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 分别用数组和链表实现栈结构 -> 正文阅读

[数据结构与算法]分别用数组和链表实现栈结构


我们都知道,栈的特点是后进先出,先进后出,也就是先进栈里的,最后才能出来。

用数组实现栈的结构

栈用数组实现的结构

push方法的代码

public boolean isFull(){
        //如果top指向最后,则说明栈满
        return maxsize-1==top;
    }
 public void push(int value){
        if(isFull()){
            System.out.println("栈满,不能在添加元素"+value);
            return;
        }
        //每添加一个元素,指针都要向上移动
        stack[++top]=value;
        System.out.println("数据"+value+"添加成功");
    }

pop方法的代码

     public boolean isEmpty(){
        return top==-1;
    }
    
      public int pop(){
        if(isEmpty()){
            throw new RuntimeException("栈空");
        }
        
        int value=stack[top];
        //取出当前的元素之后,还要把指针后移!
        top--;
        return value;
    }

遍历栈中的元素的方法

public void show(){
        if(isEmpty()){
            System.out.println("栈为空");
        }
        //遍历时,是要从栈顶开始遍历的。
        for(int i=top;i>=0;i--){
            System.out.println(stack[i]+"---"+i);
        }
    }

测试代码

package com.njupt.stack;

/**
 * Creat with IntelliJ IDEA
 *
 * @Auther:倔强的加瓦
 * @Date:2021/07/16/9:44
 * @Description:
 */
public class StackDemo {
    public static void main(String[] args) {
        Stack stack = new Stack(10);
        for (int i = 1; i <= 8; i++) {
            stack.push(i);
        }
        stack.show();
        for (int j = 1; j <= 9; j++) {
            System.out.println("第" + j + "次弹栈" + stack.pop());

        }

    }
}

class Stack {
    public int maxsize;
    public int top = -1;
    public int[] stack;

    public Stack(int maxsize) {
        this.maxsize = maxsize;
        stack = new int[maxsize];
    }

    public boolean isFull() {
        //如果top指向最后,则说明栈满
        return maxsize - 1 == top;
    }

    public boolean isEmpty() {
        return top == -1;
    }

    public void push(int value) {
        if (isFull()) {
            System.out.println("栈满,不能在添加元素" + value);
            return;
        }
        stack[++top] = value;
        System.out.println("数据" + value + "添加成功");
    }

    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈空");
        }
        int value = stack[top];
        top--;
        return value;
    }

    //显示栈中的所有元素
    public void show() {
        if (isEmpty()) {
            System.out.println("栈为空");
        }
        for (int i = top; i >= 0; i--) {
            System.out.println(stack[i] + "---" + i);
        }
    }
}

利用链表实现栈的结构

节点类信息

class Node {
    public int no;
    public Node next;

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

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                '}';
    }

和数组类似,要始终保证在插入时,一定要把插入的元素放到最前面。取元素后,也要让指针指向下一个节点。链表插入图解

push方法的代码

 //判断栈已满
    public boolean isFull() {
        return maxSize == count();
    }

    //输出链表中有多少节点
    public int count() {
        int num = 0;
        Node temp = head.next;
        while (temp != null) {
            num++;
            temp = temp.next;
        }
        return num;
    }
 public void push(Node node) {
        //如果是满的话,则不可以添加
        if (isFull()) {
            System.out.println("栈已满,不能在加");
            return;
        }
		//如果是空的话,直接加在最后即可
        if (isEmpty()) {
            head.next = node;
            //这里可搞死我了,忘了加一个return,也没有写else语句。。。
            return;
        } else {
            //temp指针始终指向第一个节点
            Node temp = head.next;
            //先让node指向temp
            node.next = temp;
            //然后让头节点指向新插入的节点
            head.next = node;
            System.out.println(node.no + "成功入栈");
        }

    }

pop出栈方法

//判断为空的方法
public boolean isEmpty() {
        return head.next == null;
    }
public void pop() {
        if (isEmpty()) {
            System.out.println("栈已空");
            return;
        } else {
            Node temp = head.next;
            if (temp.next != null) {
                System.out.println(head.next.no + "出栈");
                head.next = temp.next;
            } else {
                System.out.println(temp.no + "出栈");
                head.next = null;
            }
        }
    }

遍历方法

public void show() {
        if (isEmpty()) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head.next;
        while (true) {
            System.out.println(temp);

            if (temp.next == null) {
                break;
            }

            temp = temp.next;
        }
    }

测试代码

package com.njupt.stack;

/**
 * Creat with IntelliJ IDEA
 *
 * @Auther:倔强的加瓦
 * @Date:2021/07/16/18:11
 * @Description:使用链表实现模拟栈的结构
 */
public class ListStackDemo {
    public static void main(String[] args) {

        ListStack list = new ListStack(9);
        for (int i = 1; i <= 10; i++) {
            Node node = new Node(i);
            list.push(node);
        }
        System.out.println("=-=====");
        list.show();
        System.out.println("=-=====");

        for (int j = 1; j <= 12; j++) {
            list.pop();
        }


    }
}

//知道啦!用链表的话,就相当于逆序输出。
class ListStack {
    public int maxSize;
    public Node head = new Node(0);

    public ListStack(int maxSize) {
        this.maxSize = maxSize;
    }

    /*public ListStack(Node node){

    }*/
    public boolean isEmpty() {
        return head.next == null;
    }

    //判断栈已满
    public boolean isFull() {
        return maxSize == count();
    }

    //输出链表中有多少节点
    public int count() {
        int num = 0;
        Node temp = head.next;
        while (temp != null) {
            num++;
            temp = temp.next;
        }
        return num;
    }

    public void push(Node node) {
        //如果是空的话,直接加在最后即可
        if (isFull()) {
            System.out.println("栈已满,不能在加");
            return;
        }

        if (isEmpty()) {
            head.next = node;
            System.out.println(node.no+"成功入栈");
          
        } else {
            //temp指针始终指向第一个节点
            Node temp = head.next;
            //先让node指向temp
            node.next = temp;
            //然后让头节点指向新插入的节点
            head.next = node;
            System.out.println(node.no + "成功入栈");
        }

    }

    public void pop() {
        if (isEmpty()) {
            System.out.println("栈已空");
            return;
        } else {
            Node temp = head.next;
            if (temp.next != null) {
                System.out.println(head.next.no + "出栈");
                head.next = temp.next;
            } else {
                System.out.println(temp.no + "出栈");
                head.next = null;
            }
        }
    }

    public void show() {
        if (isEmpty()) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head.next;
        while (true) {
            System.out.println(temp);

            if (temp.next == null) {
                break;
            }

            temp = temp.next;
        }
    }
}

class Node {
    public int no;
    public Node next;

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

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                '}';
    }
}

测试结果

1成功入栈
2成功入栈
3成功入栈
4成功入栈
5成功入栈
6成功入栈
7成功入栈
8成功入栈
9成功入栈
栈已满,不能在加
=-=====
Node{no=9}
Node{no=8}
Node{no=7}
Node{no=6}
Node{no=5}
Node{no=4}
Node{no=3}
Node{no=2}
Node{no=1}
=-=====
9出栈
8出栈
7出栈
6出栈
5出栈
4出栈
3出栈
2出栈
1出栈
栈已空
栈已空
栈已空

Process finished with exit code 0

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:12:08  更:2021-07-17 12:13:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:27:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码