利用栈将中缀表达式转为后缀表达式

#include<iostream>
#include<stdio.h>
using namespace std;
#include<stack>
const int SM = 40;
int Precedence(char op){
    //返回运算符op所对应的优先级数值
    switch (op){
    case ‘+‘:
    case ‘-‘:return 1;//定义加减运算的优先级为1
    case ‘*‘:
    case ‘/‘:return 2;//定义乘除运算的优先级为2
    default:return 0;
    }
}
//将字符串s1中的中缀表达式转换为字符串s2中的后缀表达式
void Transfer(char s1[SM],char s2[SM]){
    stack<char> R;//定义运用暂存运算符的栈
    R.push(‘@‘);//栈底放入"@"字符,它具有最低优先级0
    int i, j;//用于指示扫描s1和s2中的字符串的位置
    i = 0;
    j = 0;
    char ch = s1[i];
    while (ch != ‘@‘){
        //顺序处理中缀表达式中的每个字符
        if (ch == ‘ ‘){
            ch = s1[++i];
        }//对于空格字符不做任何处理
        else if (ch == ‘(‘){
            R.push(ch);
            ch = s1[++i];
        }//当字符为左括号,直接进栈
        else if (ch == ‘)‘){
            while (R.top() != ‘(‘){
                s2[j++] = R.top();
                R.pop();
            }
            R.pop();//跳出while循环后,说明此时ch为左括号,继续左括号出栈,删除栈顶的左括号
            ch = s1[++i];
        }//当字符为右括号,使括号内的仍停留在栈中的运算符依次出栈并写入到s2中
        else if (ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘){
            //对于四则运算符,使暂存在栈中的不低于ch优先级的运算符依次出栈并写入到s2中
            char w = R.top();
            while (Precedence(w) >= Precedence(ch)){
                //Precedence()函数返回运算符形参的优先级
                s2[j++] = w;
                R.pop();
                w = R.top();
            }
            R.push(ch);
            ch = s1[++i];
        }
        else{//此处必为数字或小数点符号
            while (isdigit(ch) || ch == ‘.‘){
                //把一个数值中的每一位依次写入到s2串中
                s2[j++] = ch;
                ch = s1[++i];
            }
            //被转换后的每个数值后放入一个空格
            s2[j++] = ‘ ‘;

}
    }
        //把暂存在栈中的运算符依次出栈并写入到s2串中
        ch = R.top();
        R.pop();
        while (ch != ‘@‘){
            if (ch == ‘(‘){
                cerr << "expression error!" << endl;
                exit(1);
            }
            else(s2[j++] = ch);
            ch = R.top();
            R.pop();
        }
        s2[j++] = ‘@‘;
        s2[j++] = ‘\0‘;

}
void main(){
    char p1[40];
    char p2[40];
    cout << "输入中缀表达式:";
    cin >> p1;
    Transfer(p1, p2);
    cout << "输出后缀表达式为:" << p2 << endl;
    getchar();
}

原文地址:https://www.cnblogs.com/pesuedream/p/12496801.html

时间: 2024-12-13 06:56:32

利用栈将中缀表达式转为后缀表达式的相关文章

栈的应用:中缀表达式转为后缀表达式

1.中缀表达式转为后缀表达式 规则:(栈实现) 1)如果遇到操作数,我们就直接将其输出. 2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中. 3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止.注意,左括号只弹出并不输出. 4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止.弹出完这些元素后,才将遇到的操作符压入到栈中.有一点需要注意,只有在遇到" ) "的情况下

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

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

** * 中缀表达式转后缀表达式 * * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计 *  * 参与转换运算符 * +-/*()^% * * * 使用StringBuilder来保存转换出的后缀表达式 * 使用栈来操作运算符 * * * 转换原则 * 1.上述字符中()没有优先级值,+-优先级值为1,/*%优先级值为2,^优先级值为3 * 2.对于一个待计算的表达式,从左向右逐个检查每个字符 * 3.遇到数字,直接append到StringBuilder * 4.遇

计算器核心算法——中缀表达式转为后缀表达式

中缀表达式转后缀表达式的过程类似编译过程——四则运算表达式中的括号必须匹配——根据运算符优先级进行转换——转换后的表达式中没有括号——转换后可以顺序的计算出最终结果 这是某位伟人研究出的算法,在这里我们直接拿来用就可以. 转换过程:——当前元素e为数字:输出——当前元素e为运算符:1.与栈顶运算符进行优先级比较2.小于等于:将栈顶元素输出,转13.大于:将当前元素e入栈 ——当前元素e为左括号:入栈——当前元素e为右括号:1.弹出栈顶元素并输出,直至栈顶元素为左括号2.将栈顶的左括号从栈中弹出

JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 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,telnet,+,+,1

[转]中缀表达式、前缀表达式、后缀表达式的相互转换

--------------------------------后缀转中缀---------------------------------------------- 1.建立一个栈,从左向右扫描后缀表达式,遇到运算数则压入栈: 2.遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果作为新的运算符再压入栈: 3.依次走到表达式结尾: 例:把逆波兰式(即后缀表达式)ab+c*转换为中缀表达式: 1)a入栈(0位置) 2)b入栈(1位置) 3)遇到运算符"+",将a和b出栈,执行a+b的

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

最近一直在看数据结构这本书,我相信,对于每个程序员来说,数据结构都尤为重要.为什么要学,可以看看这位博友的认识http://blog.csdn.NET/sdkfjksf/article/details/54380659 直入主题:将中缀表达式转为后缀表达式 以及将后缀表达式转为前缀表达式的实现. 关于后缀转中缀,中缀转后缀的理论介绍,请先阅读其互转的理论知识,或者我转发的这篇文章,这里不再累赘,最好参考<数据结构与算法描述Java语言版>,接下来将会用java写. 一.首先,怎么实现中缀表达式

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

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

数据结构——栈——中缀表达式和后缀表达式

什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是一种计算符号在两个数后面的. 如123*+43/+ 中缀表达式和后缀表达式有什么关系? 其实仔细你就会发现,上面给出的式子其实都是一样的,只是计算的顺序在后缀表达式中你看不懂而已. 因为我们习惯去看中缀表达式的计算. 其实他们之间是可以互相转换的.他们也可以表达同一个意思,同一个计算式子. 为什么会