中缀转前缀 c语言
2016-03-06 00:30
531 查看
今天写后缀表达式转中缀表达式卡了好久,最后去上网问了才会,思路很清晰但是代码的组织能力欠缺。看来我也是那种伪代码写的对,代码通不过的选手。
写个普通的中缀转前缀吧,算法都是死的,就那么几步,我还调试了半天,不过对优先级的理解倒是透彻了(isp 和 icp)
利用栈将中缀表达式转成前缀表达式的思路:
1)求输入串的逆序。
2)检查输入的下一元素。
3)假如是操作数,把它添加到输出串中。
4)假如是闭括号,将它压栈。
5)假如是运算符,则
i)假如栈空,此运算符入栈。
ii)假如栈顶是闭括号,此运算符入栈。
iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。
iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。
6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。
7)假如输入还未完毕,跳转到步骤2。
8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。
9)求输出串的逆序。
写个普通的中缀转前缀吧,算法都是死的,就那么几步,我还调试了半天,不过对优先级的理解倒是透彻了(isp 和 icp)
利用栈将中缀表达式转成前缀表达式的思路:
1)求输入串的逆序。
2)检查输入的下一元素。
3)假如是操作数,把它添加到输出串中。
4)假如是闭括号,将它压栈。
5)假如是运算符,则
i)假如栈空,此运算符入栈。
ii)假如栈顶是闭括号,此运算符入栈。
iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。
iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。
6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。
7)假如输入还未完毕,跳转到步骤2。
8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。
9)求输出串的逆序。
#include<iostream> #include<vector> #include<stack> using namespace std; // in_stack precedence int isp(char op) { switch (op) { case '!': return 1; break; case '*': case '/': case '%': return 2; break; case '+': case '-': return 3; break; case '<': case '>': return 4; break; case '(': return 8; break; case '#': return 0; break; } } // incoming precedence int icp(char op) { switch (op) { case '!': return 1; break; case '*': case '/': case '%': return 2; break; case '+': case '-': return 3; break; case '<': case '>': return 4; break; case '(': return 0; break; case '#': return 0; break; } } //回到正题,中缀转前缀 void iTwof(string e) { vector<char> stack; vector<char> result; for (int i = e.size()-1; i >= 0; i--) { if (!e.empty() && e[i] >= '0' && e[i] <= '9') { result.push_back(e[i]); } else if (!e.empty() && e[i] == ')') { stack.push_back(e[i]); } else if (!e.empty() && e[i] == '(') { while (!stack.empty() && *(stack.end() - 1) != ')') { result.push_back(*(stack.end() - 1)); stack.pop_back(); } stack.pop_back(); } else { if (stack.empty() || isp(*(stack.end() - 1)) >= icp(e[i])) { stack.push_back(e[i]); } else { while (!stack.empty() && isp(*(stack.end()-1) != icp(e[i]))) { result.push_back(*(stack.end() - 1)); stack.pop_back(); } } } } while (!stack.empty()) { result.push_back(*(stack.end() - 1)); stack.pop_back(); } while (!result.empty()) { cout << *(result.end() - 1); result.pop_back(); } cout << endl; } int main(void) { <pre name="code" class="cpp" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px;"> iTwof<span style="font-family: Helvetica, Tahoma, Arial, sans-serif;">("4*3/(7-2)+6"); // +/*43-726</span>return 0;}
相关文章推荐