将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js.js"></script>
</head>
<body>
输入中缀表达式空格分隔 例如 2 + 3
<input type="text" id="input" value=""><input type="button" onclick="fun()" value="计算">
    <div id="aa">

    </div>

<script>
    /*
    *
    * #Re:【js数据结构】栈解决括号不匹配问题
    *
     *一个算术表达式的后缀表达式形式如下: op1 op2 operator
     *使用两个栈,一个用来存储操作数,另外一个用来存储操作符,设计并实现一个 JavaScript 函 数,该函数可以将中缀表达式转换为后缀表达式,然后利用栈对该表达式求值。
     */

    function Stack()
    {
        this.top = 0;
        this.arr = [];
        this.push = push;
        this.pop = pop;
        this.peek = peek;
        this.clear = clear;
        this.len = len;
        this.isEmpty = isEmpty;
    }

    function push(val)
    {
      this.arr[this.top++] = val;
    }

    function pop()
    {
        return this.arr[--this.top];
    }

    function peek(){
        return this.arr[this.top-1];
    }

    function clear(){
        delete this.arr;
        this.top = 0;
        this.arr = [];
    }

    function len(){
        return this.top;
    }

    function  isEmpty() {
        if(this.len() <= 0)
            return true;
        else
            return false;
    }

    function operatorFun(result, val, operator)
    {
        switch (operator)
        {
            case "+":
                return parseInt(result) + parseInt(val);
                break;
            case "-":
                return result - val;
                break;
            case "*":
                return result * val;
                break;
            case "/":
                return result / val;
                break;
        }
    }

    var numStack = new Stack();
    var operatorStack = new Stack();

    function fun() {
        var Str = document.getElementById("input").value;
        strline = Str.split(" ");
        for(var i = 0; i<strline.length; i++)
        {
            if(i%2 == 0)
                numStack.push(strline[i])
            else
                operatorStack.push(strline[i])

        }
        var op, operator, result;

        if(numStack.len()>0)
            result = numStack.pop()
        while(numStack.len()>0 && operatorStack.len()>0)
        {
            operator = operatorStack.pop();
            op = numStack.pop();
            result = operatorFun(result, op, operator)
        }
        console.log(result)
    }

</script>
</body>
</html>

  展示如下:

顺序从右向左,无优先级顺序,图中顺序 4*5=20, 20+4=24,结果为24

时间: 2024-08-01 10:46:58

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。的相关文章

中缀表达式转换为后缀表达式(1042)

描述 中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法.后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *.利用栈结构,将中缀表达式转换为后缀表达式.(测试数据元素为单个字符) input 中缀表达式 output 后缀表达式 样例输入 A+(B-C/D)*E 样例输出 ABCD/-E

练习3.20 a 将中缀表达式转换为后缀表达式

//将中缀表达式转换为后缀表达式 int main() { int MaxSize = 10; int str[8]={3,3,2,1,0,1,0,2}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); while(1) { tmp = getchar(); if(tmp == '\n') break; if(tmp == ' ') continue; else if(tmp == '+' || tmp == '-' || tmp == '

数据结构Java实现06----中缀表达式转换为后缀表达式

数据结构Java实现06----中缀表达式转换为后缀表达式 本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *.又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符

一般算数表达式转换为“后缀式”

“师创杯”第六届ACM程序设计竞赛获奖情况 2013级新手入门----ACM入门训练指南 --> 数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以‘#’字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+

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

1.从左而右对算数表达式进行扫描,每次读入一个字符s1[i]: 2.若遇到数字或小数点,则立即写入s2[i],若遇算数运算符,将" "(空格)写入s2[i]: 3.遇到左括号"("则压栈: 4.若遇算术运算符,如果它们的优先级比栈顶元素高,则直接进栈,否则弹出栈顶元素输出到s2[i],直到新栈顶元素的优先级比它低,然后将它压栈: 5.若遇到右括号")",则将栈顶元素输出到s2[i],直到栈顶元素为"(",然后相互抵消:当扫描到

js 中缀表达式转换为后缀表达式

算法叫逆波兰表达式逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,tel

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

[转]中缀转换为后缀表达式 一.后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储.假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下: 1)遍历表达式,遇到的数字首先放入栈中,此时栈如下所示: 2)接着读到"+",则弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中. 3)读到8,将其直接放入栈中. 4)读到"*",弹出8和5,执行8*5,并将结果40压入栈中.而后过程类似,读到&quo

中缀表达式转换为后缀表达式(python实现)

中缀表示式转换为后缀表达式 需要一个存放操作符的栈op_stack,输出结果的列表output 步骤: 从左到右遍历表达式: 1. 若是数字,直接加入到output 2. 若是操作符,比较该操作符和op_stack中操作符的优先级,若优先级大于op_stack中的,则压入到op_stack中 否则,将op_stack中优先级大于或等于该操作符优先级的所有操作符加入到output中,然后压入op_stack中 3. 若是左括号,压入到op_stack中 4. 若是右括号,将op_stack中所有左

Java版 中缀表达式转换为后缀表达式并求结果

基础知识 平时我们所说的一个算术表达式,例如:9+(3-1)*3+10/2即为中缀表达式,然而计算机无法计算中缀表达式的值,这是因为计算机无法进行带有左右括号和运算符的优先级这种混合运算.后缀表达式(又称 逆波兰式)的使用解决了上述问题. 上述的算术表达式的后缀表达式为:9 3 1 - 3 * + 10 2 / + 算法思想 如何计算上述后缀表达式的结果呢? 答案:从左到右扫描上述后缀表达式,然后: 1. 遇到数字入栈 2. 遇到运算符 将栈顶的前两个元素出栈,然后计算结果,并将计算的结果入栈