• 中缀表达式转后缀表达式,及含多位负数的中缀表达式计算(中缀转后缀解法)


    中缀转后缀步骤(来自这里):

    1).初始化两个栈:运算符栈s1和存储中间结果的栈s2;

        2).从左到右扫描中缀表达式

        3).遇到操作数时,将其压入s2;

        4).遇到运算符时,比较其与s1栈顶运算符的优先级;

      1.如果s1为空,或栈顶运算符为左括号"(",则直接将此运算符入栈

      2.否则,若优先级比栈顶运算符的高,也将运算符压入s1

      3.否则,将s1栈顶的运算符弹出并压入s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;

        5)遇到括号时:

          (1)如果时左括号"(",则直接压入s1

          (2)如果是右括号")",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃

        6)重复2至5,直到表达式的最右边

        7)将s1中剩余的运算符依次弹出并压入s2

        8)依次弹出s2中的元素并输出,结果的逆序为中缀表达式对应的后缀表达式

    单单得到后缀表达式版本:

    注意:乘方应该是右结合,所以当s[i]和栈顶都是^时要直接压进去。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. typedef long long ll;
    8. unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, {'^', 3}};
    9. stack<char>num,op;
    10. string s;
    11. bool is_num(int i)
    12. {
    13. if(s[i]>='0'&&s[i]<='9')
    14. return true;
    15. else
    16. return false;
    17. }
    18. int main()
    19. {
    20. cin>>s;
    21. for(int i=0;isize();i++)
    22. {
    23. if(is_num(i))
    24. {
    25. num.push(s[i]);
    26. }else if(s[i]=='(') op.push(s[i]);
    27. else if(s[i]==')')
    28. {
    29. while(op.top()!='(')
    30. {
    31. num.push(op.top());
    32. op.pop();
    33. }
    34. op.pop();
    35. }else
    36. {
    37. while(op.size()&&op.top()!='('&&pr[op.top()]>=pr[s[i]])
    38. {
    39. if(s[i]=='^'&&op.top()=='^')break;//乘方是右结和的
    40. num.push(op.top());
    41. op.pop();
    42. }
    43. op.push(s[i]);
    44. }
    45. }
    46. while(op.size())
    47. {
    48. num.push(op.top());
    49. op.pop();
    50. }
    51. while(num.size())
    52. {
    53. op.push(num.top());
    54. num.pop();
    55. }
    56. while(op.size())
    57. {
    58. cout<top();
    59. op.pop();
    60. }
    61. return 0;
    62. }

    得到后缀表达式用于计算版本:

    注意:

    预处理时在负号前面加0,而不是减号前加0。

    一个减号是负号当且仅当减号前的字符不是‘)’和数字。

    在实际计算的时候,两个连续的乘方其实先算哪个最后的结果都一样,所以只要求计算结果的话可以当做两个连续优先级相同的普通符号。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. stack<char>ops;
    9. stack<int>nums;
    10. unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, {'^', 3}};
    11. int qmi(int a,int k)
    12. {
    13. int res=1;
    14. while(k)
    15. {
    16. if(k&1) res=res*a;
    17. a=a*a;
    18. k>>=1;
    19. }
    20. return res;
    21. }
    22. void cal()
    23. {
    24. int b=nums.top();nums.pop();
    25. int a=nums.top();nums.pop();
    26. char c=ops.top();ops.pop();
    27. int x;
    28. if(c=='+') x=a+b;
    29. else if(c=='-') x=a-b;
    30. else if(c=='*') x=a*b;
    31. else if(c=='/') x=a/b;
    32. else if(c=='^') x=qmi(a,b);
    33. nums.push(x);
    34. }
    35. int main()
    36. {
    37. string s;
    38. cin>>s;
    39. for(int i=0;isize();i++)
    40. {
    41. if(s[i]=='-'&&i==0) s='0'+s;
    42. else if(s[i]=='-'&&i&&s[i-1]!=')'&&!(s[i-1]>='0'&&s[i-1]<='9'))
    43. {
    44. s.insert(i-1,"0");
    45. i++;
    46. }
    47. }
    48. for(int i=0;isize();i++)
    49. {
    50. if(s[i]>='0'&&s[i]<='9')
    51. {
    52. int sum=0,j=i;
    53. while(s[j]>='0'&&s[j]<='9')
    54. sum=sum*10+s[j++]-'0';
    55. nums.push(sum);
    56. i=j-1;
    57. }else if(s[i]=='(')ops.push(s[i]);
    58. else if(s[i]==')')
    59. {
    60. while(ops.top()!='(') cal();
    61. ops.pop();
    62. }else
    63. {
    64. while(ops.size()&&ops.top()!='('&&pr[ops.top()]>=pr[s[i]])
    65. cal();
    66. ops.push(s[i]);
    67. }
    68. }
    69. while(ops.size())cal();
    70. cout<top()<
    71. return 0;
    72. }

  • 相关阅读:
    15天深度复习JavaWeb的详细笔记(七)——Request、Response
    【Python】eval
    [附源码]JAVA毕业设计基于MVC框架的在线书店设计(系统+LW)
    【ARC机制下的循环引用 Objective-C语言】
    GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲
    【PyCharm Community Edition】:基础
    Polygon zkEVM哈希状态机——Keccak-256和Poseidon
    SUNLORDINC顺络电子LTCC产品推广资料
    虹科动态 | 8月23日,虹科诚邀您参加上海电子设计创新大会(EDICON Across China 2022上海站)
    Mathematica求解方程——Solve、Reduce、NSolve等函数
  • 原文地址:https://blog.csdn.net/m0_62327332/article/details/126652138