【数据结构】计算机底层是用什么识别算数表达式的?

本文介绍了栈数据结构的概念、特点及其在计算表达式、子程序调用、递归等方面的应用。通过实例展示了如何用数组模拟栈,并实现了一个中缀表达式计算器,解释了计算机如何解析和计算表达式。此外,还探讨了栈在解决复杂运算问题中的作用,例如转换为后缀表达式以简化计算。

前言

★ 这里是小冷的博客
✓ 优质技术好文见专栏
个人公众号,分享一些技术上的文章,以及遇到的坑
当前系列:数据结构系列
源代码 git 仓库 ‘
数据结构代码地址 代码Git 仓库地址

我们这里将一个场景带入学习

请输入一个表达式

计算式:[722-5+1-5+3-3] 点击计算 计算出结果

image-20211228224600286

请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。----> 栈

栈的介绍

  1. 栈的英文为(stack)

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

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

  4. 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除

  5. 图解方式说明出栈(pop)和入栈(push)的概念

入栈与出栈 : 栈 数据结构的特性 先入后出

image-20211228224941214

image-20211228224952363

栈的应用场景

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

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

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

  4. 二叉树的遍历。

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

栈 快速入门(数组模拟栈)

实现思路

image-20211228225120315

详细的每一部分的思路 都在代码的注释当中,想要详细理解可以参考代码中的注释

package com.hyc.DataStructure.Stack;

import java.util.Scanner;

/**
 * @projectName: DataStructure
 * @package: com.hyc.DataStructure.Stack
 * @className: ArrayStackDemo
 * @author: 冷环渊 doomwatcher
 * @description: TODO 用数组来模拟栈
 * @date: 2021/12/23 18:08
 * @version: 1.0
 */
public class ArrayStackDemo {
   
   
    public static void main(String[] args) {
   
   
//测试一下 ArrayStack 是否正确
//先创建一个 ArrayStack 对象->表示栈
        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("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;
    // 等于栈顶 默认等于-1 代表最底部分
    private int top = -1;

    public ArrayStack() {
   
   

    }

    // 初始化栈
    public ArrayStack(int maxSize) {
   
   
        MaxSize = maxSize;
        stack = new int[maxSize]
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值