标签: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)运算符合法性
标签:ESS end 计算机 实现 移动 als tor c++实现 依次
原文地址:https://www.cnblogs.com/taoXiang/p/12563477.html