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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kondusov
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 153
#1

Не могу разобраться, в чём ошибка. Программа перевода инфиксной записи в постфиксную. - C++

21.11.2013, 23:51. Просмотров 188. Ответов 0
Метки нет (Все метки)

вот код программы, которая должна переводить инфиксную запись в постфиксную. для бональныъ 1+2-4.... и тд работает. когда начинаю вводить бональные 1*2, то компилятор кладёт в выходную строку "1", затем он должен положить в стек знак "*", но как только он кладёт -сразу извлекает, а должен извлечь только после прочтения конечного символа входной строки ( в данном случае)


[
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <string>
 using namespace std;
struct stek
{
    char d;
    struct stek *next; // указатель на следующий элемент списка (стека)
};
 
 
void push(stek* &next, char d)
{
    stek *pv = new stek;      // объявляем новую динамическую переменную типа stek
    pv->d = d;                // записываем  значение, которое помещается в стек
    pv->next = next;          // связываем новый элемент стека с предыдущим
    next = pv;   
    cout<<"dobavil v stek  "<<d<<endl;
    // новый элемент стека становится его вершиной
}
 
char pop(stek* &next)
{  if (next==NULL)
return '\0';
 
    char temp = next->d;     // извлекаем в переменную temp значение в вершине стека
   stek *pv = next;        // запоминаем указатель на вершину стека, чтобы затем
                            // освободить выделенную под него память
   next = next->next;      // вершиной становится предшествующий top элемент
    delete pv;              // освобождаем память, тем самым удалили вершину
    cout<<"izvlek iz steka"<<temp<<endl;
    return temp;          // возвращаем значение, которое было в вершине
}
 
char CurHead(stek* & next){
    if (next==NULL)
        return 'z';
    return next->d;
 
 
}
 
int prioritet(char s){
    if (s=='+' || s=='-')
        return 1;
    if (s=='*' || s=='/')
        return 2;}
 
 
int kol;
    char c;
 
int main()
{cout<<"loh"<<endl;
    string s, otvet,zapas;
    stek*p=0;
    
 
getline(cin, s);
 
cout<<"\n vashe virazhenie v obi4noy zapisi :"<<s<<"\n";
 
for(int i=0;s[i]!='\0';i++)
    {
        if (s[i]>'0'  &&  s[i]<'9')  {           //Если эелемент = цифра от 1 до 10
            otvet+=s[i];
            cout<<"dovavil v vihod   "<<s[i]<<endl;
        }
        
        
                                    //записываем в строку ответа
            if (s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/')                      //если эл. знак операции
            {       
                if (pop(p)=='\0'){ push(p, s[i]);   kol++;}                 /* если стек пуст, то добавляем в стек операцию */
            
                if (pop(p)!='\0' && (prioritet(s[i]) > prioritet(CurHead(p)) ))
                    {push(p,s[i]);
                    kol++;}
                if(pop(p)!='\0' && (prioritet(s[i]) < prioritet(CurHead(p))))
                {   otvet+=pop(p);
                    push(p,s[i]);
                                }
 
        }
                
            
            if (s[i]=='(')                                      //встретилась открывющаяся 
                {
                push(p,s[i]);                                       //кладем её в стек 
                kol++;                                              //счётчик увеличиваем
                }                                                   //если встретилась закрывающая скобка
                    
                    if(s[i]==')')
                    {
                    
                    for (int i=0;i<kol;i++)
                {   otvet+=pop(p);                      //переносим элементы стека в выходную строку до тех пор
                    kol--;
                }
                    
                
                    }
                    
}
 
 
                    /*while(pop(p)!='(')
                    {otvet+=pop(p);
                    kol--;}*/
 
 
 
                
for (int i=0;i<kol;i++){
    
    otvet+=pop(p);
 
    }
 
 
                                                                                //пока стек непуст, выталкиваем элементы в выход
                                        
 
 
 
 
 
cout<<"POSTFIKS ---       "<<otvet<<endl;
cout<<" TUT DOLZNA LEZHAT' OTKR SKOBKA       "<<zapas;
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2013, 23:51     Не могу разобраться, в чём ошибка. Программа перевода инфиксной записи в постфиксную.
Посмотрите здесь:

Не могу разобраться в чём ошибка - C++
Массив заполнен с помощью генератора случайных чисел. Разности (1-2,3-4,..,19-20) отсортировать по возрастанию. #include &lt;iostream&gt; ...

Работа со строкой. Не могу разобраться, в чём ошибка. - C++
Есть такой код: HANDLE Search;//Объявляем хендл WIN32_FIND_DATAA FileSearch;//Создаем структуру типа WIN32_FIND_DATAA ...

Не могу разобраться в чём ошибка(инфиксная и постфиксная запись выражения) - C++
на вход для простоты подаю коротенько выражение меньше 10 символов цифры во входе тоже от 0 до 10 при выводе строки otvet ничег оне...

Из инфиксной в постфиксную - C++
Привет, опять я с этим заданием. Уже глаз болит, не могу понять в чем беда. Проблема при использовании скобок. А если вводить что-то типа...

Перевод из инфиксной в постфиксную запись - C++
Суть моей программы: перевод из инфиксной в постфиксную запись. Но проблема в том, что функция типа string не возвращает значение. В чём...

Перевести выражение из инфиксной формы в постфиксную - C++
Помогите пожалуйста написать программу. Дана строка, в которой записано математическое выражение в инфиксной форме. В этой строке могут...

Не могу понять в чём ошибка - C++
Циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима). Со сдвигом вправо...

База болезней, не могу понять в чём ошибка - C++
Задание такое База болезней: название, симптомы, процедуры, перечень рекомендуемых лекарств с указанием требуемого количества. База...

Ошибка памяти при выполнении - не могу понять в чём дело - C++
Добрый день. Есть следующий код: #include &lt;iostream&gt; using namespace std; class Matrix { private: int* arr_ptr; ...

Найти сумму элементов квадратной матрицы (не могу понять в чём ошибка) - C++
Доброго времени суток уважаемые форумчане. Пожалуйста подскажите в чем проблема, почему не работает? #include &lt;iostream&gt; ...


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

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

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