表达式求值及转换算法

后缀表达式求值算法

stack operands;  //运算数栈
while(没到表达式尾)
{
    scanf("一个运算对象op");
    if(op is 运算数)
        operands.push(op);
    else if(op is 运算符)
    {
        operand_right = operands.pop();
        operand_left = operands.pop();
        result = operand_left op operand_right;
        operands.push(result);
    }
    else
    {
        printf("Suffix expression is invalid !");
    }
}
if(operands.size() == 1)
    return operands.top();
else
    printf("Suffix expression is invalid!");

前缀表达式求值算法

算法一:从表达式尾部开始处理(从右至左)

伪代码描述:

stack operands;   //运算数栈
while(没到达表达式首)
{
    scanf("一个运算对象op");
    if(op is Operand)
        operands.push(op);
    else if(op is Operator)
    {
        operand_left = operands.pop();
        operand_right = operands.pop();
        result = operand_left op operand_right;
        operands.push(result);
    }
    else
    {
        printf("Prefix expression is invalid!");
    }
}
if(operands.size() == 1)
{
    return operands.top();
}
else
    printf("Prefix expression is invalid!");

算法二:从表达式首部开始处理(从左至右)

stack operations;  //运算对象栈,元素既可以是云算法,也可以是运算数
while(没到表达式尾)
{
    scanf("一个运算对象op");
    if(op is Operator)
    {
        operations.push(op);
    }
    else if(op is Operand)
    {
        if(operations.top() is Operator)
        {
            operations.push(op);
        }
        else
        {
            while(operations.top() is Operand)
            {
                operand_right = op;
                operand_left = operations.pop();
                operator = operations.pop();
                op = operand_left operator operand_right;
            }
            operations.push(op);
        }
    }
    else
    {
        printf("Prefix expression is invalid!");
    }
}
if(operations.size() == 1)
    return operations.top();
else
    printf("Prefix expression is invalid!");

中缀表达式转换为后缀表达式算法

stack operators;   //运算符栈
while(没到表达式尾)
{
    scanf("一个运算对象op");
    if(op is Operand)
    {
        printf(op);
    }
    else if(op is Operator)
    {
        if(op 优先级大于 operator.top() && op is not 右括号)
            operator.push(op);
        else if(op is 右括号)
        {
            do
            {
                tmp = operators.pop();
                if(tmp is not 对应左括号)
                {
                    printf(tmp);
                }
                else
                {
                    break;
                }
                if(operators.empty())
                {
                    printf("Infix expression is invalid!");
                }
            }while(1);
        }
        else
        {
            do
            {
                tmp = operators.pop();
                printf(tmp);
            }while(op 优先级小于 operators.top());
            operators.push(op);
        }
    }
    else
    {
        printf("Infix expression is invalid!");
    }
}
while(!operators.empty())
{
    tmp = operators.pop();
    printf(tmp);
}

中缀表达式转换为前缀表达式算法

从表达式尾部开始处理

stack operators;  //运算符栈stack operations;  //运算对象栈,元素既可以是运算符,也可以是运算数while (没到表达式首){
    scanf("一个运算对象op");
    if (op is Operand)
    {
        operations.push(op);
    }
    else if (op is Operator)
    {
        if (op 优先级大于 operators.top() && op is not 左括号)
            operators.push(op);
        else if (op is 左括号)
        {
            do
            {
                tmp = operators.pop();
                if (tmp is not 对应右括号)
                {
                    operations.push(tmp);
                }
                else
                {
                    break;
                }
                if (operators.empty())
                {
                    printf("Infix expression is invalid!");
                }
            }while(1);
        }
        else
        {
            do
            {
                tmp = operators.pop();
                operations.push(tmp);
            }while(op 优先级小于 operators.top());
            operators.push(op);
        }
    }
    else
    {
        printf("Infix expression is invalid!");
    }}while(!operators.empty()){
    tmp = operators.pop();
    operations.push(tmp);}while(!operations.empty()){
    tmp = operations.pop();
    printf(tmp);}
时间: 2024-11-10 07:25:38

表达式求值及转换算法的相关文章

【算法】表达式求值--逆波兰算法介绍

逆波兰算法介绍 假定给定一个只 包含 加.减.乘.除,和括号的算术表达式,你怎么编写程序计算出其结果. 问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性. 这样很难编写出统一的计算指令.使用逆波兰算法可以轻松解决.他的核心思想是将普通的中缀表达式转换为后缀表达式. 转换为后缀表达式的好处是:1.去除原来表达式中的括号,因为括号只指示运算顺序,不是完成计算必须的元素.2.使得运算顺序有规律可寻,计

表达式求值算法、rpn、1470、1475、1477、1479

以下为表达式求值系列完整算法,借用C++语言,读者不妨对照下图表达式求值算法实例,仔细推敲. 1 /* 2 DATA:2015 1 30 3 From:13420228 4 */ 5 //测试数据: 6 // 4 7 // (0!+1)*2^(3!+4) - (5! - 67 - (8+9)) 8 // (1+2)*3+4*5 9 // 1.000 + 2 / 4 10 // ((1+2)*5+1)/(4^2)*3 11 #include <iostream> 12 #include <

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

算法-表达式求值

今天在网上看到Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app,以前很早的时候知道通过算术栈和数值栈搞定的,这次用OC通过数组实现了预期的效果,编程语言系统一般都内置了对算术表达式的处理,我们可以简易的模仿一下算术表达式处理机制,思想不变,主要是实现方式略有不同.算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地说明了所有运算符的操作数,形式如下:(1+

算法手记(2)Dijkstra双栈算术表达式求值算法

这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了了解这个过程,我们可以自行搭建一套简易的算术表达式处理机制,这里就用到栈特性和本篇提到的Dijkstra算法. 概述:     算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地

【算法】E.W.Dijkstra算术表达式求值

算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3加上2,取它们的积然后加上1,就得到了101.但Java系统是如何完成这些运算的呢?不需要研究Java系统的构造细节,我们也可以编写一个Java程序来解决这个问题.它接受一个输入字符串(表达式)并输出表达式的值.为了简化问题,首先来看一下这份明确的递归定义:算术表达式可能是一个数,或者是由一个左括号

使用E.W.D.Dijkstra设计算法实现算数表达式求值

要求:编程模拟(1+(2+3)*(4*5))的运算过程,重点在于如何解析由括号运算符和数字组成的字符串,并按照正确的顺序完成各种初级运算符的操作. 实现思路:用两个栈(LIFO)结构来实现(一个用于保存运算符,一个用于保存操作数) 将操作数压如操作数栈 将操作符压如操作符栈 忽略左括号 在遇到右括号时,弹出一个运算符,并弹出所需数量的操作数,并将操作符和操作数的运算结果压到操作数栈 1 package com.luochuang.demo.stdlib; 2 3 public class Eva

表达式求值相关算法

实现对一个数学表达式的求值,例如:1+2*(3+4) 这个表达式的值为 15 这个问题主要要分为如下几个步骤: 语法分析: 将字符串表达式转化为数字和操作符的 token 数组,['1', '+', '2', '*', '(', '3', '+', '4', ')'] 转逆波兰表达式: 将中缀表达式转后缀表达式,['1', '2', '3', '4', '+', '*', '+'] 逆波兰表达式求值: 15 逆波兰表达式转二叉树: 条件表达式中,二叉树的求值能提前返回,能比逆波兰表达式计算量更少

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可