六、使用数组模拟栈的思路及代码实现

本文详细介绍了栈的特性,如FILO(后进先出),并阐述了栈在子程序调用、递归处理、表达式转换等方面的应用。通过Java代码展示了如何使用数组来模拟栈的入栈、出栈操作,并提供了测试结果,演示了栈的实际运作过程。
摘要由CSDN通过智能技术生成

使用数组模拟栈的实现过程

1.栈的介绍

(1) 栈的英文为(stack)
(2) 栈是一个先入后出(FILO-First In Last Out)的有序列表。
(3) 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
(4) 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除
(5) 图解方式说明出栈(pop)和入栈(push)的概念
在这里插入图片描述
2.栈的应用场景

(1) 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以 回到原来的程序中。
(2) 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆 栈中。
(3) 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
(4) 二叉树的遍历。
(5) 图形的深度优先(depth 一 first)搜索法。

3.使用数组模拟

(1)示意图
在这里插入图片描述
(2)思路分析

1)使用数组模拟栈
2)定义一个top,初始化top为-1
3)入栈的操作:top++; stack[top]=value;
4)出栈的操作:int value=stack[top]; top--; return value;

(3)代码实现

package cn.zzw.algorithm.Stack;

import java.util.Scanner;

public class ArrayStackDemo {
    public static void main(String[] args) {

        //创建一个栈空间
        ArrayStack stack=new ArrayStack(3);
        String key="";
        Scanner scanner = new Scanner(System.in);
        boolean loop=true;

        while (loop)
        {
            System.out.println("show:显示栈");
            System.out.println("exit:退出程序");
            System.out.println("push:添加元素到栈中");
            System.out.println("pop:元素出栈");
            System.out.println("请输入您的操作");
            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;
                default:
                    break;
            }
        }
        System.out.println("程序已经退出");
    }
}

class ArrayStack
{
    private int maxSize;
    private int[] stack;//使用数组模拟栈
    private int top=-1;

    //构造器
    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;
    }

    //入栈操作
    public void push(int value)
    {
        if(isFull())
        {
            System.out.println("栈满,不能再添加元素");
            return;
        }
        top++;
        stack[top]=value;
    }

    //出栈操作
    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]);
        }
    }
}


(4)测试结果

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=16739:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.Stack.ArrayStackDemo
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
栈中没有数据
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
20
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
30
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
50
栈满,不能再添加元素
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
stack[2]=30
stack[1]=20
stack[0]=10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
出栈的元素是30
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
stack[1]=20
stack[0]=10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
出栈的元素是20
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
出栈的元素是10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
栈空
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
栈中没有数据
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值