msu_goncharenko

Untitled

Dec 8th, 2019
82
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <stack>
  4. #include <cmath>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. string convert(string a)
  10. {
  11. string str;
  12. for(int i = 0; i<a.size(); i++)
  13. {
  14. if(a[i]!=' ') str.insert(str.end(), a[i]);
  15. }
  16. return str;
  17. }
  18. // проверка корректности выражения (последовательности чисел и знаков операции)
  19. bool correct_operation_signs(string a)
  20. {
  21. bool rightness = true; // булева переменная для фиксирования ошибочного выражения
  22. set<char> operand = {'+', '*', '/', '-', '^'};
  23.  
  24. if (operand.count(a[0])!= 0 && a[0]!='-') // проверка символа на наличие операнда
  25. {
  26. rightness = false;
  27. }
  28.  
  29. else if (operand.count(a[a.size()]) != 0)
  30. {
  31. rightness = false;
  32. }
  33. /* если всё верно (в начале и в конце стоят не знаки), то выполняется цикл,
  34. который прогоняет строку на предмет двух символов подряд. */
  35. else
  36. {
  37. for (int i = 0; i < a.size(); i++)
  38. {
  39. if (operand.count(a[i])!=0 && operand.count(a[i+1])!=0)
  40. {
  41. rightness = false;
  42. }
  43. if((a[i] == '/') && (a[i+1] == '0')) // случай деления на 0
  44. {
  45. rightness = false;
  46. }
  47. }
  48. }
  49. return(rightness); // если нигде ошибки не было, то rightness=true
  50. }
  51.  
  52. // проверка корректности выражения (последовательности скруглых скобок)
  53. bool correct_parenthesis(string a)
  54. {
  55. bool rightness = true; // булева переменная для фиксирования ошибочного выражения
  56. stack<char> st; // стек в котором хранятся скобки
  57. set<char> opening_parenthesis = {'(', '{', '['};
  58. set<char> closing_parenthesis = { ')', '}', ']'};
  59.  
  60. for(int i = 0; i < a.size(); i++)
  61. {
  62. if (closing_parenthesis.count(a[i]) != 0)
  63. {
  64. if (a[i] == ')')
  65. {
  66. if(st.size()!=0)
  67. {
  68. if (st.top() == '(')
  69. {
  70. st.pop();
  71. }
  72. else
  73. {
  74. rightness = false;
  75. break;
  76. }
  77. }
  78. else
  79. {
  80. rightness = false;
  81. break;
  82. }
  83. }
  84. if (a[i] == '}')
  85. {
  86. if(st.size()!=0)
  87. {
  88. if (st.top() == '{')
  89. {
  90. st.pop();
  91. } else
  92. {
  93. rightness = false;
  94. break;
  95. }
  96. }
  97. else
  98. {
  99. rightness = false;
  100. break;
  101.  
  102. }
  103. }
  104. if (a[i] == ']')
  105. {
  106. if(st.size()!=0)
  107. {
  108. if (st.top() == '[')
  109. {
  110. st.pop();
  111. }
  112. else
  113. {
  114. rightness = false;
  115. break;
  116. }
  117. }
  118. else
  119. {
  120. rightness = false;
  121. break;
  122. }
  123. }
  124. }
  125. else if (opening_parenthesis.count(a[i]) != 0)
  126. {
  127. st.push(a[i]);
  128. }
  129. }
  130.  
  131. if(st.size()>0 && rightness==true)
  132. {
  133. rightness = false;
  134. }
  135.  
  136. return rightness;
  137. }
  138.  
  139. int main()
  140. {
  141. string str; // исходная посл-ть
  142. getline(cin, str);
  143. str = convert(str);
  144.  
  145. if (correct_operation_signs(str) && correct_parenthesis(str))
  146. {
  147. cout << "Correct" << endl;
  148. return 0;
  149. }
  150.  
  151. cout << "Incorrect" << endl;
  152. return 0;
  153. }
RAW Paste Data