zoukankan      html  css  js  c++  java
  • 中缀表达式转前缀和后缀表达式

    1. #ifndef POSTFIX_TO_NIFIXEXPRESS_H
    2. #define POSTFIX_TO_NIFIXEXPRESS_H
    3. #include<iostream>
    4. #include<string>
    5. #include<stack>
    6. /************************************************************************/
    7. /* 中缀表达式转前缀表达式
    8. 建立一个栈来保存运算符,和一个字符容器存字符及运算符的输出。
    9. 从后向前扫描中缀表达式:
    10. 1、如果遇到的是普通字符那么存入容器中
    11. 2、如果遇到的是‘)’,存入容器中
    12. 3、如果遇到的是运算符(大于等于栈顶的优先级就入栈,否则弹栈)
    13. 如果当前栈为空或者当前运算符的优先级大于等于栈顶元素的优先级,那么入栈。
    14. 如果栈顶元素是‘)’,还是入栈。
    15. 如果当前运算符的优先级小于栈顶元素的优先级,那么弹栈存入容器中,一直到栈顶元素为‘)’或
    16. 者当前运算符的优先级大于或者等于栈顶元素的优先级。将当前运算符入栈。
    17. 4、如果遇到‘(’,那么弹栈存入容器一直遇到到‘)’,将‘)’弹出
    18. 5、返向输出容器中的字符
    19. */
    20. /************************************************************************/
    21. std::string nifixExpressToPrefix(std::string &nifixExp){
    22. std::stack<char> operStack;
    23. std::string prefixExp;
    24. for(auto iter=nifixExp.rbegin(); iter!=nifixExp.rend(); iter++){
    25. if(*iter!='*'&&*iter!='\'&&*iter!='+'&&*iter!='-'&&*iter!='('&&*iter!=')'){
    26. prefixExp.push_back(*iter);
    27. }else if(*iter==')'){
    28. operStack.push(*iter);
    29. }else if(*iter=='('){
    30. while(operStack.top()!=')'){
    31. prefixExp.push_back(operStack.top());
    32. operStack.pop();
    33. }
    34. operStack.pop();
    35. }else if(*iter=='*'||*iter=='\'){
    36. operStack.push(*iter);
    37. }else if(*iter=='+'||*iter=='-'){
    38. if(operStack.empty()){
    39. operStack.push(*iter);
    40. }else{
    41. if(operStack.top()=='-'||operStack.top()=='+'||operStack.top()==')'){
    42. operStack.push(*iter);
    43. }else{
    44. while(!operStack.empty()){
    45. if(operStack.top()==')'||operStack.top()=='+'||operStack.top()=='-'){
    46. break;
    47. }
    48. prefixExp.push_back(operStack.top());
    49. operStack.pop();
    50. }
    51. operStack.push(*iter);
    52. }
    53. }
    54. }
    55. }
    56. while(!operStack.empty()){
    57. prefixExp.push_back(operStack.top());
    58. operStack.pop();
    59. }
    60. std::string strResult;
    61. for(auto iter=prefixExp.rbegin(); iter!=prefixExp.rend(); iter++){
    62. strResult.push_back(*iter);
    63. }
    64. return strResult;
    65. }
    66. #endif

    1. #ifndef NIFIX_TO_POSTFIX_H
    2. #define NIFIX_TO_POSTFIX_H
    3. #include<iostream>
    4. #include<string>
    5. #include<stack>
    6. /************************************************************************/
    7. /* 中缀表达式转后缀表达式
    8. 建立一个运算符的栈,从左向右开始扫描中缀表达式。
    9. 1、如果是字符则直接输出
    10. 2、如果是‘(’,那么入栈。
    11. 3、如果是运算符:(大于栈顶的优先级就入栈,否则弹栈)
    12. 如果栈顶的元素是‘(’或者当前运算符的优先级比栈顶元素优先级高,那么入栈。
    13. 如果当前的运算符的优先级比栈顶的优先级低或者相等,那么就弹栈输出,一直输出到栈顶的运算符
    14. 的优先级比当前运算符优先级低或者栈为空,以及栈顶为'('。将当前的运算符压入栈。
    15. 4、如果是‘)’,那么一直弹栈输出,一直弹到第一次看到‘(’
    16. */
    17. /************************************************************************/
    18. std::string nifixToPostfix(const std::string &nifixExp){
    19. std::stack<char> operaStack;
    20. std::string postfixStr;
    21. for(auto iter=nifixExp.begin(); iter!=nifixExp.end(); iter++){
    22. if(*iter!='*'&&*iter!='\'&&*iter!='+'&&*iter!='-'&&*iter!='('&&*iter!=')'){
    23. postfixStr.push_back(*iter);
    24. }else if(*iter=='('){
    25. operaStack.push('(');
    26. }else if(*iter==')'){
    27. while(operaStack.top()!='('){
    28. postfixStr.push_back(operaStack.top());
    29. operaStack.pop();
    30. }
    31. operaStack.pop();
    32. }else if(*iter=='*'||*iter=='\'){
    33. if(operaStack.empty()){
    34. operaStack.push(*iter);
    35. }else{
    36. if(operaStack.top()=='+'||operaStack.top()=='-'||operaStack.top()=='('){
    37. operaStack.push(*iter);
    38. }else{
    39. while(!operaStack.empty()){
    40. if(operaStack.top()=='('||operaStack.top()=='+'||operaStack.top()=='-'){
    41. break;
    42. }
    43. postfixStr.push_back(operaStack.top());
    44. operaStack.pop();
    45. }
    46. operaStack.push(*iter);
    47. }
    48. }
    49. }else if(*iter=='+'||*iter=='-'){
    50. if(operaStack.empty()){
    51. operaStack.push(*iter);
    52. }else{
    53. while(!operaStack.empty()){
    54. if(operaStack.top()=='('){
    55. break;
    56. }
    57. postfixStr.push_back(operaStack.top());
    58. operaStack.pop();
    59. }
    60. operaStack.push(*iter);
    61. }
    62. }
    63. }
    64. while(!operaStack.empty()){
    65. postfixStr.push_back(operaStack.top());
    66. operaStack.pop();
    67. }
    68. return postfixStr;
    69. }
    70. #endif










  • 相关阅读:
    一个有趣的js现象
    根相对路径的简单例子
    几道简单有趣的js题(一)
    js流程控制题——如何实现一个LazyMan
    HTML5 十大新特性(十)——Web Socket
    HTML5 十大新特性(九)——Web Storage
    HTML5 十大新特性(八)——Web Worker
    HTML5 十大新特性(七)——拖放API
    HTML5 十大新特性(六)——地理定位
    HTML5 十大新特性(五)——SVG绘图
  • 原文地址:https://www.cnblogs.com/yml435/p/4784293.html
Copyright © 2011-2022 走看看