fork download
  1. //參考: goo.gl/pXeQhA
  2. //中序轉前序
  3.  
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7.  
  8. unsigned GetOperatorLevel(char op)
  9. {
  10. if(op == '&')return 1;
  11. if(op == '+' || op == '-')return 2;
  12. if(op == '*' || op == '/')return 3; // 可按照運算元優先權修改
  13. return 0;
  14. }
  15. unsigned MaxOperatorLevel()
  16. {
  17. return 3;
  18. }
  19.  
  20. string FindNextLevelOperator(string inorder,unsigned &index,unsigned op_level = 0);
  21.  
  22. string FindValue(string inorder,unsigned &index)
  23. {
  24. if(index == inorder.size())return "";
  25.  
  26. char value = inorder[index];
  27. ++index;
  28. return string()+value;
  29. }
  30. string FindNextLevelOperator(string inorder,unsigned &index,unsigned op_level)
  31. {
  32. if(op_level > MaxOperatorLevel())
  33. {
  34. // 遞迴到超過最大的 Operator Level ,如果沒有輸入錯誤,那只剩下運算元
  35. return FindValue(inorder,index);
  36. }
  37. string x = FindNextLevelOperator(inorder,index,op_level+1);
  38. while(index != inorder.size() && GetOperatorLevel(inorder[index]) == op_level)
  39. {
  40. char op = inorder[index];
  41. ++index;
  42. string y = FindNextLevelOperator(inorder,index,op_level+1);
  43. x = op + x + y;
  44. }
  45. return x;
  46. }
  47.  
  48. void ToPreorder(string inorder)
  49. {
  50. unsigned index = 0;
  51. cout << inorder << "\t轉前序:\t" <<FindNextLevelOperator(inorder,index) << endl;
  52. }
  53.  
  54. int main()
  55. {
  56. string str;
  57. while(cin >> str)
  58. {
  59. ToPreorder(str);
  60. }
  61. return 0;
  62. }
  63.  
Success #stdin #stdout 0s 3476KB
stdin
A+B+C
A+B&C*D*E
A*B+C*D
A*B+C*D+E*F
stdout
A+B+C	轉前序:	++ABC
A+B&C*D*E	轉前序:	&+AB**CDE
A*B+C*D	轉前序:	+*AB*CD
A*B+C*D+E*F	轉前序:	++*AB*CD*EF