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