数据结构 - 栈

目录

二、栈的实现

1.数组模拟实现栈

设计思想:

 方法实现:

 Peek(): 偷窥栈顶元素

pop(): 栈顶出栈

push():

2.链表模拟实现

 3 . 栈的继承体系

总结


前言

大家好,这篇博客带大家了解一下栈是什么? 并且用两种方式为大家实现一下栈


一、栈是什么?

栈是一种数据结构,它遵循"后进先出"(Last In First Out,LIFO)的原则。栈可以看作是一种特殊的线性表,只能在表的一端进行插入和删除操作,这一端被称为栈顶。栈的另一端被称为栈底。

数据结构 - 栈_第1张图片

 数据结构 - 栈_第2张图片

栈中的方法: 栈的基本操作包括入栈(push)和出栈(pop)。入栈将元素放入栈顶,出栈将栈顶元素移除。栈还可以支持其他操作,如获取栈顶元素(top)和判断栈是否为空(empty)。

栈的应用场景 : 

1.子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。

2. 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。

3.表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)

4.二叉树的遍历。

5.图形的深度优先(depthfirst)搜索法。

二、栈的实现

栈的实现有两种方式: 1.数组模拟实现 2.链表模拟实现

1.数组模拟实现栈

设计思想:

1. 模拟实现栈的数组

2. 数组的容量capacity

3. 指向栈顶的指针

框架代码

public class Stack {
    private int capacity;
    private int top = -1; // 刚开始栈中没有元素,设置初始值为-1
    private int[] stack = new int[capacity];

    public Stack(int capacity) {
        this.capacity = capacity;
    }

   // 判断栈是否空的方法
   public Boolean IsEmpty(){
       return top == -1;
   }

   // 判断是否栈满方法
   public Boolean IsFull(){
       return top == capacity - 1;
   }
}      

 方法实现:

参考[Java参考文档].JDK_API_1_6_zh_CN (1).CHM

数据结构 - 栈_第3张图片

 Peek(): 偷窥栈顶元素

数据结构 - 栈_第4张图片

 

public int Peek(){
    if(IsEmpty()){
        throw new RuntimeException("栈空!");
    }
    return stack[top];
}

pop(): 栈顶出栈

数据结构 - 栈_第5张图片

public int pop(){
    // 判断栈是否为空
    if(IsEmpty()){
        throw new RuntimeException("栈空,无法出栈!");
    }
    int topVal = stack[top];
    top--;
    return topVal;
}

 出栈时直接将栈顶元素记录下来,再将top-- 即可,不需要修改top-- 之前stack[top]的值

push():

数据结构 - 栈_第6张图片

public void push(int val){
    if(IsFull()){
        throw new StackFullException("栈满!"); // 自定义异常类,来表示栈满
    }
    stack[++top] = val;
}

自定义异常忘了没?  JAVA中的深情哥-Exception(异常)-上_喜欢吃animal milk的博客-CSDN博客

2.链表模拟实现

由于链表实现和数组实现差别不是天大,这里直接给出代码

public class ListStack {

    LikedList head = new LikedList(-1);

    public void push(int no){
        LikedList node = new LikedList(no);
        LikedList cur = head;

        while(cur.next != null){
            cur = cur.next;
        }
        cur.next = node;
    }

    public int pop(){
        LikedList cur = head;
        if(cur.next == null){
            throw new StackEmptyException("栈空");
        }

        while(cur.next.next != null){
            cur = cur.next;
        }
        int value = cur.next.no;
        cur.next = null;
        return value;
    }
}

// 节点类,定义为外部类
class LikedList{
    int no;
    LikedList next;

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

 3 . 栈的继承体系

数据结构 - 栈_第7张图片


总结

本文到此结束,总的来说是很简单的,下篇博客会给大家将栈的综合应用

你可能感兴趣的:(数据结构与算法,数据结构)