数据结构之栈对逆BoLand表达式的计算

后缀表达式:运算符位于操作符之后,计算机对该式是从做到右进行计算,计算过程如下例子

本章给出的是逆波兰表达式(后缀表达式)的计算Demo,为了便于计算,在给出的后缀表达式中加入了空格,并且使用list集合进行遍历,至于中缀怎么转变成后缀,后面文章

会给出案例.

代码如下:

package com.ebiz.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @author YHj
 * @create 2019-07-24 14:17
 * 逆波兰表达式,实现计算器
 */
public class NiPoLandCalculator {

    public static void main(String[] args) {
        //定义一个逆波兰表达式(后缀表达式)  (30+4)*5-6 => 30 4+5*6-
        //为了方便,数字以及运算符之间用空格隔开
        String expression="30 4 + 5 * 6 - ";

        List<String> list = getList(expression);

        int resul=getResult(list);
        System.out.println("resul = " + resul);

    }

    //输出计算结果
    private static int getResult(List<String> list) {
        Stack<String> stack = new Stack<>();
        for (String s : list) {
            //匹配数字,可匹配多位数
            if (s.matches("\\d+")){
                stack.push(s);
            }else {
                int num01=Integer.parseInt(stack.pop());
                int num02=Integer.parseInt(stack.pop());
                int result=0;
                if (s.equals("+")){
                    result=num01+num02;
                }else if (s.equals("-")){
                    result=num02-num01;
                }else if (s.equals("*")){
                    result=num02*num01;
                }else if (s.equals("/")){
                    result=num02/num01;
                }else {
                    throw new RuntimeException("无法解析的字符串");
                }
                stack.push(""+result);
            }
        }
        return Integer.parseInt(stack.pop());
    }

    //将表达式的值以空格进行拆分,加入到arraylist中,便于操作(不适用索引)
    private static List<String> getList(String str) {
        String[] split = str.split(" ");
        ArrayList<String> list = new ArrayList<>();
        for (String s : split) {
            list.add(s);
        }
        return list;
    }

}

原文地址:https://www.cnblogs.com/jiushixihuandaqingtian/p/11241126.html

时间: 2024-08-30 01:58:00

数据结构之栈对逆BoLand表达式的计算的相关文章

栈,逆波兰表达式???

这两天一直在想老师提出的要求:四个数的运算,让一个函数去实现,一次性的把四个数字以及三个运算符传递过去(数是随机产生的,运算符是随机产生的),说到随机产生运算符下面是我写的随机产生运算符的例子,但是还是没有达到自己想要的要求,自己也上网查了一些资料,但是介绍的都不是很详细,看不太懂,而且大部分都是些怎么不让其产生重复的元素. 这样写的结果是有些情况永远也出不来而且这样写的结果就好像是每一个数组里面的元素就好像是商量好了一样,说第几个元素出来就第几个元素出来,请求老师指导一下. 还说四个数的运算吧

栈实现逆波兰表达式

栈实现逆波兰表达式 2015-04-05 Lover雪儿 1 //逆波兰表达式 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <ctype.h> 6 7 #define STACK_INIT_SIZE 20 //初始栈大小 8 #define STACK_INCREMENT 10 //扩充栈时每次增加的内存 9 #define MAXBUFFER 10 //

续前篇-关于逆波兰表达式的计算

相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少. 具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html 这里也大致梳理一下: 1.新建一个栈将逆波兰表达式的数字依次压入栈中 2.当遇到运算符时,出栈两个数同时将运算结果压栈 3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果. 实现如下: 1 #include <iostream> 2 #include <stack> 3 using namespace st

栈的操作实现逆波兰表达式的计算

代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int StackSize; }sqStack; v

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

Java解析字符串表达式--逆波兰表达式的计算

问题来由: 读入一个字符串形式的四则运算表达式,输出对应的计算结果.如读入的是"6 * ( 5 + ( 2 + 3) * 8 + 3)",那么解析后的输出结果应为288. 思路: 一般的计算过程是这样的,首先计算优先级最高的小括号里面的内容,即"( 5 + ( 2 + 3) * 8 + 3)", 将"2 + 3"的计算结果并存为A,接着用计算"A*8",并存为B 计算"5+B+3",结果存为C 最后计算&q

数据结构之 栈和队列---算术表达式的转换(前缀+中缀+后缀)

算术表达式的转换 Time Limit: 1000MS Memory limit: 65536K 题目描述 小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下. 因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑.聪明的你帮他解决吧. 输入 输入一算术表达式,以\'#\'字符作为结束标志.(数据保证无空格,只有一组输入) 输出 输出该表达式转换所得到的前缀式 中缀式 后缀式.分三行输出,顺序

【数据结构】栈的应用——中缀表达式求值(c++)

头文件: #pragma once #include <iostream> #include <assert.h> #include <string> using namespace std; template<class Type> class SeqStack { public: SeqStack(size_t sz = INIT_SZ); ~SeqStack(); public: bool empty()const; bool full()const;

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例: