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

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

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

Не могу найти ошибку. (стеки) - C++

08.11.2013, 17:45. Просмотров 210. Ответов 7
Метки нет (Все метки)

Преобразовать входую инфиксную запись выражения в постфиксную. Пока что делаю для бональных сложений и вычитаний. Не работает когда использую скобки. Вылетает локальный отладчик. В чём проблема?

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
#include <iostream>
#include <string>
 using namespace std;
struct stek
{
    char d;
    struct stek *next; // указатель на следующий элемент списка (стека)
};
 
 
void push(stek* &next, int d)
{
    stek *pv = new stek;      // объявляем новую динамическую переменную типа stek
    pv->d = d;                // записываем  значение, которое помещается в стек
    pv->next = next;          // связываем новый элемент стека с предыдущим
    next = pv;                // новый элемент стека становится его вершиной
}
 
char pop(stek* &next)
{  
    char temp = next->d;     // извлекаем в переменную temp значение в вершине стека
    stek *pv = next;        // запоминаем указатель на вершину стека, чтобы затем
                            // освободить выделенную под него память
    next = next->next;      // вершиной становится предшествующий top элемент
    delete pv;              // освобождаем память, тем самым удалили вершину
    
    return temp;          // возвращаем значение, которое было в вершине
}
int kol;
int main()
{
    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]<'10')             //Если эелемент = цифра от 1 до 10
        otvet+=s[i];                                //записываем в строку ответа
            if (s[i]=='+' || s[i]=='-' ||s[i]=='*' || s[i]=='/'){   //если эл. знак операции
            push (p,s[i]);                                  //кладем его в стек
            kol++;                                          //увеличиваем счётчик колва элементов в стеке
        }
                if (s[i]=='(')                                      //встретилась открывющаяся скобка
                {
                push(p,s[i]);                                       //кладем её в стек 
                kol++;                                              //счётчик увеличиваем
                }                                                   //если встретилась закрывающая скобка
                    if(s[i]==')')
                {
                    while(pop(p)!='(')                              //переносим элементы стека в выходную строку до тех пор
                    {                                               //пока не встретим открывающуюся скобку
                        otvet+=pop(p);
                        kol--;}
                    if(pop(p)=='('){
                    pop(p);                                       //когда дошли до открыв скобки-удаляем её из стека
                    kol--;}
                    if (pop(p)=='+' || pop(p)=='-' ||pop(p)=='*' || pop(p)=='/'){//если остались элементы стека - выводим в выходную строку
                    otvet+=pop(p);
                    kol--;}
 
                                        }
 
}
 
 
for(int i=0;i<kol;i++)
    otvet+=pop(p);
cout<<"POSTFIKS ---       "<<otvet<<endl;
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2013, 17:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу найти ошибку. (стеки) (C++):

Найти слова, повторяющиеся более одного раза, не могу найти ошибку - C++
#include &lt;iostream&gt; using namespace std; void obr1(char **s, char **mas, int n, int m) { int i; int k; char *tm; for(i...

Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) - C++
// Заданы матрицы X(8;4),Y(5;5),Z(6;9). // Для каждой из матриц определить строку, в которой находится наименьшее // количество...

Не могу найти ошибку - C++
Не могу найти ошибку 1. Минимальный по модулю элемент массива. 2. Сумму модулей элементов массива, расположенных после первого...

Не могу найти ошибку - C++
Добрый день, вот простенькая задача: &quot;В одном шаге от счастья&quot; Вова купил билет в трамвае 13-го маршрута и сразу посчитал суммы...

Не могу найти ошибку - C++
Не получается вывести сформированную матрицу. Выводит с каким-то мусором. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include...

Не могу найти ошибку - C++
Добрый день! Третий день маюсь. Программа решает систему уравнений методом Гаусса. Программа разделена на две функции: в первой функции...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
08.11.2013, 17:50 #2
Не знаю что у тебя там со скобкой, но вот это точно работать не будет: s[i]<'10'
kondusov
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 153
08.11.2013, 17:57  [ТС] #3
castaway, нужно 's[i]'<10 ?

Добавлено через 3 минуты
castaway, кстати, я ведь просматриваю строку ,и когда я беру очередной элемент, то я фактически имею дело с его кодом, не так ли? как раз мой вариант и правильный вроде
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
08.11.2013, 18:17 #4
Цитата Сообщение от kondusov Посмотреть сообщение
я ведь просматриваю строку ,и когда я беру очередной элемент, то я фактически имею дело с его кодом,
Цитата Сообщение от kondusov Посмотреть сообщение
if (s[i]>'0' && s[i]<'10') //Если эелемент = цифра от 1 до 10
Нет цифры 10, есть число 10, состоящее из двух цифр. В одиночных кавычках может быть цифра (одиночный символ), но не число из двух цифр (это уже строка).
kondusov
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 153
08.11.2013, 18:20  [ТС] #5
понял. поменял 10 на 9, мне не принципиально. что же делать со скобками?
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
08.11.2013, 18:50 #6
Страныый у вас стек. Вы, хотя бы, для названия вершины стека какое-нибудь другое название придумали, а то везде next.
kondusov
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 153
08.11.2013, 23:22  [ТС] #7
стек работает замечательно
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
08.11.2013, 23:58 #8
Цитата Сообщение от kondusov Посмотреть сообщение
стек работает замечательно
Тогда тему закройте.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2013, 23:58
Привет! Вот еще темы с ответами:

Не могу найти ошибку - C++
Всем привет. НАчал читать учебник Дейтеля (5е издание), дошел до момента &quot;отделение интерфейса от реализации&quot;, и в примерах, которые...

Не могу найти ошибку - C++
Добрый день, программа не компилируется, не могу найти ошибку. Заранее спасибо. #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() ...

Не могу найти ошибку( - C++
Когда ввожу матрицу 4 на 4 все норм, когда больше размерность то не переставляет блоки!! Помогите разобраться почему так? ...

Не могу найти ошибку - C++
{ char str={0}; char str2={0}; int k=0; int n=8; strcpy(str,this-&gt;Edit1-&gt;Text.c_str()); for(int i=0; str!='\0';i++) { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.11.2013, 23:58
Ответ Создать тему
Опции темы

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