我的编程空间,编程开发者的网络收藏夹
学习永远不晚

栈的应用-综合计数器的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

栈的应用-综合计数器的实现

目录

前言

一、思路分析

二、代码实现

总结

前言

在实现综合计数器之前,大家应该先了解一下什么是前中后缀表达式

前缀、中缀和后缀表达式是表示数学表达式的三种不同方式。

  1. 前缀表达式(也称为波兰式或前缀记法):操作符位于操作数之前。例如,"+ 2 3"表示加法操作,其中2和3是操作数。

  2. 中缀表达式:操作符位于操作数之间。这是我们通常使用的数学表达式表示方式。例如,"2 + 3"表示加法操作,其中2和3是操作数。

  3. 后缀表达式(也称为逆波兰式或后缀记法):操作符位于操作数之后。例如,"2 3 +"表示加法操作,其中2和3是操作数。

这三种表达式都可以表示相同的数学运算,只是操作符和操作数的排列顺序不同。在计算机中,后缀表达式常用于数学表达式的求值,因为它可以通过使用栈来进行简单而高效的计算。

本次实现综合计算器就是借助后缀表达式来实现,为了简单起见,我们并不加入()等的符号


一、思路分析

定义两个栈,一个栈为数栈(NumStack)用来存放数字,另一个栈为符号栈,用来存放符号

1. 通过一个 index  值(索引),来遍历我们的表达式

2. 如果我们发现是一个数字, 就直接入数栈

3. 如果发现扫描到是一个符号,  就分如下情况

  3.1 如果发现当前的符号栈为 空,就直接入栈

  3.2 如果符号栈有操作符,就进行比较,果当前的操作符的优先级小于或者等于栈中的操作符, 就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前的操作符入符号栈, 果当前的操作符的优先级大于栈中的操作符, 就直接入符号栈.

4. 当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.

5. 最后在数栈只有一个数字,就是表达式的结果

我们来举个例子 图解 计算 7*2*2-5+1 = 24

二、代码实现

代码量太大,不可能一步一步解析了,上面的过程如果能看懂,并且编程有一定基础,下面代码应该不成问题,代码出处033_尚硅谷_栈实现综合计算器-思路分析(1)_哔哩哔哩_bilibili

大家可以去看看

package 逆波兰计数器;import StackDemo.StackEmptyException;import java.util.Arrays;import java.util.Scanner;class Test{    public static void main(String[] args) {        String str = "7*2*2-5+1";        ArrayStack numStack = new ArrayStack(10);        ArrayStack operaStack = new ArrayStack(10);        String s = "";        int nums1 = 0;        int nums2 = 0;        int index = 0;        int opera = 0;        char ch = ' ';        while (true) {            ch = str.charAt(index);            // 判断该字符是否是符号            if(operaStack.isOpera(ch)){                // 判断符号栈是否为空                if(!operaStack.isEmpty()){                    // 判断优先级                    if(operaStack.priority(ch) <= operaStack.priority(operaStack.peek())){                        nums1 = numStack.pop();                        nums2 = numStack.pop();                        opera = operaStack.pop();                        int cal = numStack.cal(nums1, nums2, opera);                        numStack.push(cal);                        operaStack.push(ch);                    }else{                        operaStack.push(ch);                    }                }else{                    // 符号栈为空,直接入栈                    operaStack.push(ch);                }            }else{                boolean flag = true;// 定义标志位 检查字符串是否达到末尾                // 处理非个位数的情况 如 88 66 这样的数                while (!operaStack.isOpera(ch)) {                    s+=ch;                    if(index == str.length() -1 ){                        numStack.push(Integer.parseInt(s));                        flag = false;                        break;                    }else {                        index++;                        ch = str.charAt(index);                    }                }                if(!flag){                    break;                }                numStack.push(Integer.parseInt(s));                s = "";                index--;            }            index++;            if(index>=str.length()){                break;            }        }        while (true) {            if(operaStack.isEmpty()){                System.out.println(str+"="+numStack.pop());                break;            }            nums1 = numStack.pop();            nums2 = numStack.pop();            opera = operaStack.pop();            int cal = numStack.cal(nums1, nums2, opera);            numStack.push(cal);        }    }}public class ArrayStack {    private final int capacity;    private int top = -1;    private int[] stack ;    public ArrayStack(int capacity){        this.capacity = capacity;        stack = new int[capacity];    }    // 入栈    public void push(int data){        if(isFull()){            stack = Arrays.copyOf(stack,capacity*2);        }        top++;        stack[top] = data;    }    // 出栈    public int pop(){        if(isEmpty()){            throw new StackEmptyException("队列为空,无法删除元素");        }        int value = stack[top];        top--;        return value;    }    // 查看栈顶的值    public int peek(){        return stack[top];    }    // 制定优先级规则    public int priority(int opera){        if(opera == '*' || opera == '/'){            return 1;        }else if(opera == '+' || opera == '-'){            return 0;        }else{            return -1;        }    }    // 判断是否为运算符    public boolean isOpera(int val){        return val == '+' || val == '-' || val == '*' || val == '/';    }    // 运算方法    public int cal(int num1,int num2,int opera){        return  switch (opera) {            case '+' -> num1 + num2;            case '-' -> num2 - num1;            case '*' -> num1 * num2;            case '/' -> num2 / num1;            default -> -1;        };    }    public boolean isFull(){        return top == capacity - 1;    }    public boolean isEmpty(){        return top == - 1;    }}

总结

关于栈的应用远不止于此,大家也不必全部了解,只要能运用到这种程度,在刷点面试题,应付面试足矣!

来源地址:https://blog.csdn.net/weixin_73869209/article/details/132791952

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

栈的应用-综合计数器的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java怎么用栈实现综合计算器

本篇内容介绍了“Java怎么用栈实现综合计算器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!栈栈(stack)又名堆栈,它是一种运算受限的线
2023-07-02

Java数据结构之栈与综合计算器的实现

这篇文章主要为大家详细介绍了Java数据结构中栈与综合计算器的实现,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
2022-11-13

浅谈java反射和自定义注解的综合应用实例

前言前几天学习了反射和自定义注解,刚好工作中遇到一个小问题:前台传递到后台的必填字段为空,导致不能插入数据库。就是这样一个小问题,让我考虑到是否可以做一个通用的方法,让前台传递过来的必填字段在后台也校验一遍,如果传递为空,则把响应字段返回提
2023-05-31

MongoDB与大数据技术栈的结合实践与架构设计

MongoDB是一款非关系型数据库,具有高可扩展性、高性能和灵活的数据模型等特点,在大数据领域有着广泛的应用。本文将介绍MongoDB与大数据技术栈的结合实践与架构设计。一、MongoDB在大数据技术栈中的地位和作用在大数据技术栈中,Mon
MongoDB与大数据技术栈的结合实践与架构设计
2023-11-02

Python栈算法的实现与简单应用示例

本文实例讲述了Python栈算法的实现与简单应用。分享给大家供大家参考,具体如下: 原理: 栈作为一种数据结构,是一种只能在一端进行插入和删除操作。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈
2022-06-04

使用JavaScript实现响应式计数器动画

在本文中,我们将学习如何使用 HTML CSS 和 JavaScript创建响应式计数器动画。 我们在很多地方都可以用,比如适用于不同类型的个人网站、企业网站等,感兴趣的可以了解一下
2022-11-13

递归在 C++ 数据结构中的妙用:栈和树的实现

递归在 c++++ 数据结构中的应用:栈:通过后进先出 (lifo) 结构递归实现栈。树:通过分层结构递归实现树,支持插入和深度计算等操作。递归为处理嵌套结构提供了简洁高效的解决方案,使数据结构的实现更加直观和易于维护。递归在 C++ 数据
递归在 C++ 数据结构中的妙用:栈和树的实现
2024-05-04

聚合函数在实时数据分析中的应用

聚合函数在实时数据分析中起着非常重要的作用,主要用于对大量实时数据进行汇总和计算,从而提取出有用的信息和洞见。以下是一些聚合函数在实时数据分析中的应用:计数:通过计数函数可以统计某个特定事件发生的次数,例如统计网站访问量、用户登录次数等。求
聚合函数在实时数据分析中的应用
2024-08-03

聚合函数在数据仓库中的应用实践

数据仓库中的聚合函数在数据分析和报表生成中起着至关重要的作用。聚合函数能够对大量数据进行统计、计算和汇总,以便生成有用的汇总信息。以下是聚合函数在数据仓库中的应用实践:汇总数据:聚合函数可以对数据仓库中的大量数据进行汇总,如计算总和、平均值
聚合函数在数据仓库中的应用实践
2024-08-03

PHP函数在云计算中的应用现状?

php 函数在云计算中广泛应用,包括:数据操作:连接云数据库并执行数据库操作。文件操作:读写云存储服务中的文件。api 集成:调用云服务 api,例如 aws 和 azure。cli 应用:创建用于自动化云任务的 cli 脚本。PHP 函数
PHP函数在云计算中的应用现状?
2024-04-13

Cassandra数据的分布式聚合和计算怎么实现

Cassandra是一个分布式数据库系统,可以通过将数据分布在多个节点上来实现分布式聚合和计算。以下是实现分布式聚合和计算的一些常见方法:使用Cassandra的查询语言CQL进行聚合和计算:可以使用CQL语句来对分布在多个节点上的数据进行
Cassandra数据的分布式聚合和计算怎么实现
2024-05-11

MySQL 复合主键在数据库设计中的应用详解

MySQL 复合主键在数据库设计中的应用详解MySQL 复合主键是指由多个字段组成的主键,通过组合这些字段的值来唯一标识一条记录。在数据库设计中,复合主键的应用非常广泛,特别是在需要唯一标识某个实体的情况下。本文将详细介绍MySQL复合主
MySQL 复合主键在数据库设计中的应用详解
2024-03-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录