当前位置:   article > 正文

提取字符串中最长的数学表达式并计算(C++)_提取字符串中的最长数学表达式并计算

提取字符串中的最长数学表达式并计算
  1. #include <iostream>
  2. #include <stack>
  3. #include <string>
  4. #include <regex>
  5. using namespace std;
  6. bool priority(char top, char b){
  7. if(top == '('){//为左括号
  8. return false;
  9. }
  10. if(top == '-' || top == '+' && b == '*'){
  11. return false;//高则压栈
  12. }
  13. if((top == '+' || top == '-') && (b == '+' || b == '-')){
  14. return false;
  15. }
  16. else{
  17. return true;//计算
  18. }
  19. }
  20. void compute(stack<int>& s1, stack<char>& s2){
  21. int b = s1.top();
  22. s1.pop();
  23. int a = s1.top();
  24. s1.pop();
  25. char ch = s2.top();
  26. s2.pop();
  27. int sum = 0;
  28. if(ch == '+'){
  29. sum = a + b;
  30. }
  31. else if(ch == '-'){
  32. sum = a - b;
  33. }
  34. else{
  35. sum = a*b;
  36. }
  37. s1.push(sum);
  38. }
  39. int main() {
  40. //先找到最长的数学表达式子
  41. string s;
  42. getline(cin, s);
  43. //查找最长合法数学表达式
  44. regex math("(-?\\d+)([\\*+-]\\d+)*"); // 定义正则表达式,匹配数字和操作符序列
  45. sregex_iterator it(s.begin(), s.end(), math);//允许遍历一个字符串中所有符合正则表达式的子串
  46. sregex_iterator end;
  47. string longstr = "";
  48. while(it != end){
  49. if(it->str().size() > longstr.size()){
  50. longstr = it->str();
  51. }
  52. it++;
  53. }
  54. longstr = longstr + ')';//加上右括号
  55. stack<int> arr;
  56. stack<char> symbol;
  57. string temp = "";
  58. symbol.push('(');//先压入左括号
  59. bool flag = false;//标记是负号还是减号
  60. for(int i = 0; i < longstr.size(); i++){
  61. if(longstr[i] >= '0' && longstr[i <='9']){
  62. temp += longstr[i];
  63. }
  64. else if(longstr[i] == ')'){//如果是右括号
  65. flag = false;//后续的第一个-为负号
  66. arr.push(stoi(temp));
  67. temp = "";
  68. while(symbol.top()!='('){
  69. compute(arr, symbol);
  70. }
  71. symbol.pop();
  72. }
  73. else if(longstr[i] == '-'){
  74. if(!flag){//第一次出现-
  75. temp += '-';
  76. flag = true;
  77. }
  78. else{//是符号
  79. arr.push(stoi(temp));
  80. temp = "";
  81. while(priority(symbol.top(), longstr[i])){
  82. compute(arr, symbol);
  83. }
  84. symbol.push(longstr[i]);//不计算,压栈
  85. }
  86. }
  87. else{//是其他符号
  88. flag = true;//下次遇到的-为符号
  89. arr.push(stoi(temp));
  90. temp = "";
  91. while(priority(symbol.top(), longstr[i])){
  92. compute(arr, symbol);
  93. }
  94. symbol.push(longstr[i]);
  95. }
  96. }
  97. cout << arr.top() << endl;
  98. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号