解析表达式---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)运算符合法性

猜你喜欢

转载自www.cnblogs.com/taoXiang/p/12563477.html