Форум программистов, компьютерный форум CyberForum.ru

Обратная польская нотация - C++

Восстановить пароль Регистрация
 
raaawr
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
03.07.2013, 21:29     Обратная польская нотация #1
Доброго времени суток, форумчане! В общем, такая проблема: написал алгоритм приведения введенного арифметического выражения к виду, соответствующему его обратной польской записи, дело в том, что результат в выходной строке делится пробелами посимвольно, а не по числам/знакам, как хотелось бы. Голова уже кипит, и ведь очевидно, что "истина где-то рядом", но реализовать не получается
т.е. я ввожу 22+2, на выходе вместо 22 2 + получаю 2 2 2 +, что не есть хорошо, помогите, пожалуйста, разобраться
заранее спасибо!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include "string.h"
#include "ctype.h"
 
using namespace std;
 
char stack[50], opz[50], sp=0;
int prior(char ch){
   switch (ch){
   case '(': return 0;
   case ')': return 1;
   case '+': case '-': return 2;
   case '*': case '/': return 3;
   case ' ': return 4;
   default: if (isalnum(ch))
          return -1;
          else return 5;
   }
}
int get_token(){
   static int i=0;
   char ch;
   cin.get(ch);
   if (ch=='\n'){
      if (stack[i]!=' ')
         for(i; i>=0; i--){
 
            opz[sp++]=stack[i];
         }
      return 0;
   }
   switch (prior(ch)){
   case -1: {
       opz[sp++]=ch;
 
       return 1;
   }
   case 4: return 1;
   case 5: return -1;
   default:
      if (ch==')'){
         for (i; stack[i]!='('; i--) {
            opz[sp++]=stack[i];
            stack[i]=' ';
         }
        stack[i--]=' ';
      }
      else
         if (ch!='(' && stack[i]!=' ' && prior(ch)<=prior(stack[i])){
            int fl=0;
            for(i; fl==0 && i>=0; i--){
               if (i!=0 && prior(stack[i-1])<prior(ch))
                  fl=1;
               opz[sp++]=stack[i];
            }
            stack[++i]=ch;
         }
         else
            if (stack[i]!=' ')
               stack[++i]=ch;
            else
               stack[i]=ch;
      return 1;
   }
}
int main(){
   int k;
   for (k=0; k<50; k++)
      stack[k]=' ';
   cout << "Enter string:\n";
   while (cin){
      k=get_token();
      if (k==0)
         break;
      if (k==-1) {
         cout<<"Error!";
         break;
      }
      else continue;
   }
 
   cout <<opz<<endl;
   return 0;
}
P.S. Пишу в Code::Blocks, С++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 21:29     Обратная польская нотация
Посмотрите здесь:

Обратная Польская Нотация C++
Обратная польская запись C++
Обратная польская запись C++
Обратная польская запись C++
C++ Обратная польская запись
Польская инверсная нотация C++
C++ Обратная Польская Запись
Обратная польская нотация через структуру C++
C++ Обратная польская запись
Обратная польская запись C++
Обратная польская запись. С++ C++
C++ Обратная польская запись

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 18:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru