天天看点

数据结构-栈(一)数组模拟栈的实现一.栈的概念二.数组模拟栈思路分析

一.栈的概念

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(来源于百度百科)

对上述的概念进行总结得到栈的几个特征

  • 栈是线性表,但是栈的操作是受限的
  • 对栈的操作应该遵循先进后出,后进先出的规律
  • 允许插入删除的一段成为栈顶(top)
  • 固定的一段成为栈底(botton)
    数据结构-栈(一)数组模拟栈的实现一.栈的概念二.数组模拟栈思路分析
    栈的应用场景:
  • 子程序调用,堆栈
  • 递归调用
  • 表达式的转换(中缀表达式,后缀表达式)
  • 二叉树的遍历
  • 图形深度优先搜索算法

二.数组模拟栈思路分析

1.定义一个top来表示栈顶,初始化值为-1

数据结构-栈(一)数组模拟栈的实现一.栈的概念二.数组模拟栈思路分析
  • 入栈的操作,当有数据入栈时,top ++; stack[top] = data;
    数据结构-栈(一)数组模拟栈的实现一.栈的概念二.数组模拟栈思路分析
  • 出栈的操作,先使用变量取值int value = stack[top],然后top–;
    数据结构-栈(一)数组模拟栈的实现一.栈的概念二.数组模拟栈思路分析

三.代码实现

import java.util.Scanner;

public class ArrayStackDemo {
    public static void main(String[] args) {
        //创建栈对象
        ArrayStack stack = new ArrayStack(4);
        String key = "";
        boolean loop = true;
        Scanner scanner = new Scanner(System.in);
        while (loop){
            System.out.println("show:显示栈");
            System.out.println("push:入栈");
            System.out.println("pop:出栈");
            System.out.println("exit:退出");
            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.printf("出栈的数据是:%d\n",res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case "exit":
                    scanner.close();
                    loop = false;
                    break;
            }
        }
    }
}


//定义一个类表示栈结构
class ArrayStack{
    /*
    栈的大小
     */
    private int maxSize;
    /*
    数组,数组模拟栈,数据就放在该数组
     */
    private int[] stack;
    /*
    top表示栈顶,初始化-1
     */
    private int top = -1;

    /**
     * 构造器,初始化数组
     * @param maxSize
     */
    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;
    }

    /**
     * 入栈-push
     */
    public void push(int value){
        //先判断栈满
        if(isFull()){
            System.out.println("栈已满");
            return;
        }
        top++;
        stack[top] = value;
    }

    /**
     * 出栈-pop
     */
    public int pop(){
        //先判断栈是否为空
        if(isEmpty()){
            //抛出异常
            throw new RuntimeException("栈空,没有数据");
        }
        int value = stack[top];
        top--;
        return value;
    }

    /**
     * 遍历栈,遍历时,需要从栈顶开始显示数据
     */
    public void list(){
        if(isEmpty()){
            System.out.println("栈空,没有数据");
            return;
        }
        for(int i = top; i >= 0; i--){
            System.out.printf("stack[%d]=%d\n",i,stack[i]);
        }
    }

           

欢迎访问我的个人博客

继续阅读