用数组实现栈(数据结构与算法)

一、栈的介绍
(1)、栈的英文为(stack)。

(2)、栈是一个先进后出(FILO-First In Last Out)的有序列表。

(3)、栈(stack)是限 制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈项(Top),另外一端为固定的一 端,称为栈底(Bottom)。

(4)、根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈项,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。

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

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

(3)、表达式的转换与求值(实际解决)。

(4)、 二叉树的遍历。

(5)、图形的深度优先(depth- first)搜索法 。

三、实现栈的思路分析

1.使用数组来模拟栈。

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

3.入栈的操作,当有数据加入到栈时,top++; stack[top] = data;

4.出栈的操作,int value = stack[top]; top–, return val。

用数组实现栈(数据结构与算法)_第1张图片
具体实现代码如下:

package com.ycx.stack;

import java.util.Scanner;

public class ArrayStackDemo {
    public static void main(String[] args) {
         //测试
        // 先创建一个ArrayStack对象表示栈
        ArrayStack stack = new ArrayStack(4);
        String key = " ";
        boolean loop = true;
        Scanner input = 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 = input.next();
            switch (key){
                case "show":
                    stack.print();
                    break;
                case "push":
                    System.out.println("输一个数");
                    int val=input.nextInt();
                    stack.push(val);
                    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":    //退出程序
                    input.close();//关闭
                    loop=false;
                    break;

                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }
}

//定义一个ArrayStack 表示栈
class ArrayStack {
    private int maxSzie; //栈的大小
    private int[] stack; //数组:数组模拟栈 (数据存放在该数组中)
    private int top = -1;//top: 栈顶 初始化为-1

    //构造器
    public ArrayStack(int maxSzie) {
        this.maxSzie = maxSzie;
        stack = new int[this.maxSzie]; // 初始化数组
    }

    //1、判断栈满
    public boolean isFull() {
        return top == maxSzie - 1; //因为top初始值为-1
    }

    //2、判断栈空
    public boolean isEmpty() {
        return top == -1;
    }

    //3、入栈 push
    public void push(int val) {
        if (isFull()) {
            System.out.println("栈满");
            return;
        }
        top++;
        stack[top] = val;
    }

    //4、出栈 pop
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈空"); // 不用写return 因为抛出异常之后自动return
        }
        int val = stack[top];
        top--;
        return val;
    }

    //5、显示栈(遍历栈): 需要从栈顶开始遍历
    public void print(){
        if(isEmpty()){
            System.out.println("栈空,没有数据");
            return;
        }

        //从栈顶开始
        for (int i = top; i>=0; i--) {
            System.out.printf("stack[%d]=%d\n", i , stack[i]);
        }
    }
}

运行结果如下:
用数组实现栈(数据结构与算法)_第2张图片

你可能感兴趣的:(JAVA,数据结构,栈,数据结构,算法,堆栈,栈,java)