fork(12) download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int main() {
  6. string str,stack;
  7. char word, word_last;
  8. while(cin>>word){
  9. if((word>=48)&&(word<=57)){ //если символ это число
  10. if((word_last>=48)&&(word_last<=57)){ // Проверка, я вляется ли предыдущий символ - числом
  11. str+=word; //Если да , то просто добавляем его, тем самым не разрушая число
  12. }
  13. else{
  14. str+=' '; // В противном случае добавляем пробел и добавляем символ в главную строку
  15. str+=word;
  16. }
  17. }
  18.  
  19. if(((word>=42)&&(word<=47))||(word==94)){ //если символ это операнд
  20. if(word=='*'){ //Замена умножения
  21. word='.';
  22. }
  23. if(word=='-'){ //Замена минуса
  24. word=',';
  25. }
  26. if(stack.empty()){ // Если стэк пустой - то просто кладем символ в стэк
  27. stack+=word;
  28. }
  29. else{ // Если стэк не пуст
  30. if((stack.back()>=word)||(stack.back()==word-1)||(stack.back()==word+1)){ // Если верхний элемент стэка имеет больший приоритет
  31. while((stack.back()>=word)||(stack.back()==word-1)||(stack.back()==word+1)){ //выталкиваем все элементы из стэка
  32. str+=' '; //До тех пор, пока приоритет верхнего элемента не будет
  33. str+=stack.back(); //ниже входящего символа
  34. stack.pop_back();
  35. }
  36. stack+=word;
  37. }
  38. else{ // если же верхний элемент ниже приоритетом - то просто кладем символ в стэк
  39. stack+=word;
  40. }
  41. }
  42. }
  43. if(word=='('){ //Если символ - открывающая скобка
  44. stack+=word; //добавляем ее в стэк
  45. }
  46. if(word==')'){ //Если встречающийся симвлл - закрывающая скобка
  47. while(stack.back()!='('){ // пока в стэке не встретится открывающая скобка
  48. str+=' '; // выталкиваем в главную строку все символы
  49. str+=stack.back();
  50. stack.pop_back();
  51. }
  52. stack.pop_back(); //Удаляем открывающую скобку из стека
  53. }
  54.  
  55. word_last=word; //Присваеваем значение текущего символа для проверки в последующем цикле
  56.  
  57. /*cout << "Numb:" << i++ << endl; // Распечатка пошаговых действий
  58. cout << "Word: |" << word << endl;
  59. cout <<"STR:| " << str <<"| SRA:|" << stack << endl;*/
  60. }
  61. while(!stack.empty()){ //При окончании строки выталкиваем все символы из стека
  62. str+=' ';
  63. str+=stack.back();
  64. stack.pop_back();
  65. }
  66.  
  67. for( int i=0; i<str.length();i++){ // Проходим циклом финальную строку для возврата тербуемых символов
  68. if(str[i]=='.')
  69. str[i]='*';
  70. if(str[i]==',')
  71. str[i]='-';
  72. }
  73.  
  74. cout <<"ИТОГ: ___ " << str << endl;
  75. return 0;
  76. }
Success #stdin #stdout 0s 3436KB
stdin
78 ^ 6-3+9^(2-1)
stdout
ИТОГ:     ___   78 6 ^ 3 - 9 2 1 - ^ +