码迷,mamicode.com
首页 > 编程语言 > 详细

解析表达式---C++实现

时间:2020-03-25 01:55:15      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:ESS   end   计算机   实现   移动   als   tor   c++实现   依次   

 

1. 中缀、前缀、后缀表达式

  对于一个人可识别的表达式:1+(2+3)*4-5

  根据操作符的位置不同分为:

    ①中缀表达式:1+(2+3)*4-5

    ②前缀表达式:- + 1 * + 2 3 4 5  

    ③后缀表达式:1 2 3 + 4 * + 5 -

  前缀表达式和后缀表达式里面已经包含了计算顺序,因此不需要括号来确定优先级

2. 中缀转前缀

  2.1 中缀转前缀

  ①按运算符优先级对所有的运算单位加括号

    ((1+((2+3)*4))-5)

  ②将运算符移动到对应括号的前面

    - ( + ( 1 * ( + 2 3 ) 4 )) 5 )

  ③去掉括号,得到前缀表达式

    - + 1 * + 2 3 4 5

 转换的计算机实现:

(1)表达式树

(2)栈 

  ①两个栈,运算符栈S1、存储中间结果栈S2

  ②从右到左扫描表达式

  ③遇到操作数,压栈S2

  ④遇到运算符,比较其与S1栈顶运算符优先级

    若S1为空,或栈顶为右括号 ‘)‘ ,则此运算符入栈S1

    若优先级比栈顶运算符高或相等,则此运算符入栈S1

    若比栈顶优先级低,将S1栈顶运算符出栈压到S2里面,然后继续与S2栈顶运算符比较

  ⑤遇到括号

    右括号直接压入S1

    左括号,则依次弹出S1栈顶运算符到S2,直到遇到右括号,此时将这一堆括号丢弃

  ⑥重复直到表达式最左边

  ⑦将S1剩余运算符依次弹出压到S2

  ⑧依次弹出S2重元素,得到前缀表达式  

 

  2.2 前缀表达式解析计算

  ①从右到左扫描表达式

  ②遇到数字,则数字压栈,遇到运算符,取出栈顶的两个数做运算:栈顶 op 次顶,结果入栈

  ③重复直到表达式最左侧

3. 中缀转后缀

  3.1 中缀转后缀  

  ①按运算符优先级对所有的运算单位加括号

  ②将运算符移动到对应括号的后面

  ③去掉括号,得到前缀表达式

(1)表达式树

(2)栈

 

  3.2 后缀表达式解析结算 

  ①从左到右扫描表达式

  ②遇到数字,数字压栈,遇到运算符,取出栈顶两个数做运算:次顶 op 栈顶,结果入栈

  ③重复,直到表达式最右侧

4. 表达式合法性判断

(1)括号的合法性

 这里的括号表达式只有 { } [ ] ( ) ,暂不算数字和运算符,且输入的表达式字符串里面没有其他无效字符

bool expreIsOK()
{

    map<char,char> exmap = {{‘}‘,‘{‘},{‘]‘,‘[‘},{‘)‘,‘(‘}};
    stack<char> char_stack;
    string str;
    getline(cin,str);
    cout<<"Your expression:"<<str<<endl;
    string::iterator iter = str.begin();
    while(iter != str.end()) {
        if(exmap.find(*iter) != exmap.end()) { //如果是右括号
            if(char_stack.empty() || char_stack.top() != exmap[*iter]) {
                return false;
            }
            else {
                char_stack.pop();
            }
        }
        else { //如果是左括号
            char_stack.push(*iter);
        }
        ++iter;
    }
    if(char_stack.empty()) {
        return true;
    }
    else {
        return false;
    }
}

 

(2)运算符合法性

 

解析表达式---C++实现

标签:ESS   end   计算机   实现   移动   als   tor   c++实现   依次   

原文地址:https://www.cnblogs.com/taoXiang/p/12563477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!