百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Java数据结构:栈(表达式求值)(java实现栈数据结构)

toyiye 2024-07-08 00:55 21 浏览 0 评论

表达式求值是程序设计语言编译中的一个最基本问题。它的实现是栈应用的又一个典型例子。表达式求值可以通过将中缀表达式转换为后缀表达式(逆波兰表达式)来实现,并使用栈对后缀表达式进行求值。

  1. 将中缀表达式转换为后缀表达式(逆波兰表达式)。
  2. 使用栈来存储操作符,遍历中缀表达式的每个元素。
  3. 如果是数字,则直接输出。
  4. 如果是操作符,则判断其与栈顶操作符的优先级,如果栈顶操作符优先级较高,则弹出栈顶操作符并输出,直到栈为空或者栈顶操作符优先级不高于当前操作符。
  5. 如果是左括号,则入栈。
  6. 如果是右括号,则弹出栈内所有操作符并输出,直到遇到左括号为止。
  7. 使用栈对后缀表达式进行求值。
  8. 遍历后缀表达式的每个元素。
  9. 如果是数字,则入栈。
  10. 如果是操作符,则从栈中弹出两个操作数进行计算,并将结果入栈。

下面以表达式4+2*3-10/5为例编写应用程序。

import java.util.Stack;

public class ExpressionEvaluator {
    public static void main(String[] args) {
        String expression = "4+2*3-10/5";
        System.out.println("Result: " + evaluateExpression(expression)); // 输出计算结果
    }

    public static int evaluateExpression(String expression) {
        String postfixExpression = infixToPostfix(expression); // 中缀转后缀
        return evaluatePostfix(postfixExpression); // 求值后缀表达式
    }

    public static String infixToPostfix(String expression) {
        StringBuilder postfix = new StringBuilder();
        Stack<Character> operatorStack = new Stack<>();

        for (char ch : expression.toCharArray()) {
            if (Character.isDigit(ch)) {
                postfix.append(ch); // 如果是数字,直接输出到后缀表达式
            } else if (ch == '+' || ch == '-') {
                while (!operatorStack.isEmpty() && (operatorStack.peek() == '+' || operatorStack.peek() == '-' || operatorStack.peek() == '*' || operatorStack.peek() == '/')) {
                    postfix.append(operatorStack.pop()); // 弹出栈内优先级高于当前操作符的操作符
                }
                operatorStack.push(ch); // 当前操作符入栈
            } else if (ch == '*' || ch == '/') {
                while (!operatorStack.isEmpty() && (operatorStack.peek() == '*' || operatorStack.peek() == '/')) {
                    postfix.append(operatorStack.pop()); // 弹出栈内优先级高于当前操作符的操作符
                }
                operatorStack.push(ch); // 当前操作符入栈
            } else if (ch == '(') {
                operatorStack.push(ch); // 左括号入栈
            } else if (ch == ')') {
                while (!operatorStack.isEmpty() && operatorStack.peek() != '(') {
                    postfix.append(operatorStack.pop()); // 弹出栈内所有操作符直到遇到左括号
                }
                operatorStack.pop(); // 弹出左括号
            }
        }

        while (!operatorStack.isEmpty()) {
            postfix.append(operatorStack.pop()); // 将栈内剩余操作符输出
        }

        return postfix.toString();
    }

    public static int evaluatePostfix(String postfixExpression) {
        Stack<Integer> operandStack = new Stack<>();

        for (char ch : postfixExpression.toCharArray()) {
            if (Character.isDigit(ch)) {
                operandStack.push(Character.getNumericValue(ch)); // 如果是数字,入栈
            } else {
                int operand2 = operandStack.pop();
                int operand1 = operandStack.pop();
                switch (ch) {
                    case '+':
                        operandStack.push(operand1 + operand2);
                        break;
                    case '-':
                        operandStack.push(operand1 - operand2);
                        break;
                    case '*':
                        operandStack.push(operand1 * operand2);
                        break;
                    case '/':
                        operandStack.push(operand1 / operand2);
                        break;
                }
            }
        }

        return operandStack.pop(); // 返回栈顶元素,即表达式的计算结果
    }
}

说明:

  1. infixToPostfix 方法将中缀表达式转换为后缀表达式。
  2. evaluatePostfix 方法对后缀表达式进行求值。

相关推荐

Python第三课3. Python 的非正式介绍

3.Python的非正式介绍?在下面的例子中,通过提示符(>>>与...)的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每...

如何使用 Python 构建一个“谷歌搜索”系统?| 内附代码

来源|hackernoon编译|武明利,责编|Carol出品|AI科技大本营(ID:rgznai100)在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统。基本上,这...

Python 模拟微博登陆,亲测有效!(如何用python爬微博)

今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要做那件必做之事!模拟登陆……代码是参考了:https://www.douban.com/note/201767245/,我对代码进...

Python 驱动的 AI 艺术批量创作: 免费的Bing 绘图代码解析

这篇文章将深入分析一段Python代码,该代码利用Bing的AI绘图功能,即bing的images/create,根据用户提供的文本提示生成图像。我们将详细探讨其工作原理、代码结构、...

Python爬虫Scrapy库的使用入门?(python scrapy爬虫)

Scrapy是一个开源的并且支持高度可扩展的Python爬虫框架,主要被用来实现从网站提取数据。出现之初就是为网页抓取而设计,但是现在它也可以被用于从APIs中抓取数据或通用的Web抓取任务。Sc...

Python3 标准库概览(python标准库有什么)

操作系统接口os模块提供了不少与操作系统相关联的函数。>>>importos>>>os.getcwd()#返回当前的工作目录'C:\\Python34...

零基础入门学习Python(三):变量和字符串

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来的是...

Python读写docx文件(python读写word)

Python读写docx文件Python读写word文档有现成的库可以处理pipinstallpython-docx安装一下。https://python-docx.readthedocs.io/...

如何利用Xpath抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

如何利用Xpath选择器抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

python之Scrapy爬虫案例:豆瓣(python爬虫书籍豆瓣评分)

python模块之Scrapy爬虫框架...

Python编程入门学习:最常见加密方式和Python实现

前言我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。将字符串...

一日一技:Python中的string.rindex()方法

string.rindex()方法string.rindex()方法返回字符串内子字符串的最高索引(如果找到)。如果未找到子字符串,则会引发异常。rindex()的语法为:...

Asterisk-ARI对通道中的DTMF事件处理

Asterisk通道中关于DTMF处理是一个非常重要的功能。通过DTMF可以实现很多的业务处理。现在我们介绍一下关于ARI对通道中的DTMF处理,我们通过自动话务员实例来说明Asterisk如何创建一...

PyQt5 初次使用(pyqt5下载官网)

本篇文章默认已安装Python3,本篇文章默认使用虚拟环境。安装pipinstallPyQt5PyQt一些图形界面开发工具QtDesigner、国际化翻译工具Liguist需要另外...

取消回复欢迎 发表评论:

请填写验证码