JAVA 数据结构-06 (1)栈的基本数据结构实现(数组实现,链表实现)

JAVA 数据结构-06 栈

JAVA 数据结构-06 (2) 栈结构的应用 简易计算表达式的计算(中缀表达式)
JAVA 数据结构-06 (3) 栈结构的应用 前 中 后缀三种表达式 中缀表达式转后缀表达式 逆波兰计算器实现和算法思路

  • 栈是一个先入后出的有序列表

  • 栈式限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表.允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端 ,称为栈底.

  • 栈的基本应用场景:

    • 子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,直到子程序执行完成之后再将地址取出,以回到原来的程序.
    • 处理递归调用:和子程序调用类似,只是除了存储下一个指令的地址外,也将参数和区域变量等数据存入堆栈中
    • 表达式的转换 [中缀表达式转后缀表达式] 与求值
    • 二叉树的遍历
    • 图的深度优先遍历

1.栈基础数据结构的实现

1.1 使用数组模拟栈

思路分析:

  • 使用数组来模拟栈,需要一个指向栈顶的指针;
  • 定义一个top来指向栈顶的数据,初始化为-1,表示没有数据,
  • 入栈:当有数据加入栈时. top++; stack[top] = data;
  • 出栈: int value = stack[top]; top–;
class ArrayStack {
    
    
    private int maxSize;
    private int stack[];
    private int top = -1;

    public ArrayStack(int maxSize) {
    
    
        this.maxSize = maxSize;
        this.stack = new int[maxSize];
    }

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

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

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

    public void push(int data){
    
    
        if(isFull()){
    
    
            System.out.println("栈满,无法压入数据");
            return;
        }
        top++;
        stack[top] = data;
    }

    public int pop(){
    
    
        if(isEmpty()){
    
    
            throw new RuntimeException("栈为空,无法取出数据");
        }
        int value = stack[top];
        top --;
        return value;
    }

    public void showStack(){
    
    
        if(isEmpty()){
    
    
            System.out.println("栈为空");
            return ;
        }
        for (int i = top; i >=0 ; i--) {
    
    
            System.out.printf("stack[%d] = %d \n",i,stack[i]);
        }
    }
}

1.2 使用链表模拟栈

  • 因为链表取末尾节点需要进行遍历操作,较为麻烦,所有将链表头设置为栈顶.
  • 插入元素时从头节点插入,采用头插法,需要辅助头指针head.
class LinkListStack{
    
    
    private Data head = new Data(-1);

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

    //头插法,head.next表示栈顶
    public void push(Data node){
    
    
        node.next = head.next;
        head.next = node;
    }
    public Data pop(){
    
    
        if(isEmpty()){
    
    
            throw new RuntimeException("栈空,无法取出数据");
        }
        Data data = head.next;
        head.next = data.next;
        return data;
    }
    public void showStack(){
    
    
        if(isEmpty()){
    
    
            System.out.println("栈空");
            return;
        }
        Data temp = head.next;
        while (temp !=null){
    
    
            System.out.println(temp);
            temp = temp.next;
        }
    }

}

class Data{
    
    
    public int data;
    public Data next;

    public Data(int data) {
    
    
        this.data = data;
    }

    @Override
    public String toString() {
    
    
        return "Data{" +
                "data=" + data +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44634197/article/details/108552077