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

Стек. Исправить ошибку - C++

Восстановить пароль Регистрация
 
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
18.11.2010, 16:52     Стек. Исправить ошибку #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
#include <iostream>
#include<stack>
#include<queue>
#include<deque>
#include <string>
 
using namespace std;
 
int main()
{
    string mas;
    stack <string> st;
 
    int count=0;
    int n;
    
    cin >> n;
    cin >> mas;
 
    for (int i=0; i<n; i++)
    {
        if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
        {
            st.push(mas[i]);
        }
        if (mas[i]==')' || mas[i]==']' || mas[i]=='}')
        {
            if (st.back()==mas[i])
            {
                st.pop();
            }
            else
            {
                count++;
            }
        }
    }
    if (count==0)
    {
        cout << "yes";
    }
    else
    {
        cout << "no";
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
18.11.2010, 17:02     Стек. Исправить ошибку #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
#include <iostream>
#include<stack>
#include<queue>
#include<deque>
#include <string>
 
using namespace std;
 
int main()
{
string mas;
stack <string> st;
 
int count=0;
int n;
 
cin >> n;
cin >> mas;
 
for (int i=0; i<n; i++)
{
if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
{
st.push(mas[i]);
}
if (mas[i]==')' || mas[i]==']' || mas[i]=='}')
{
if (st.back()==mas[i])
{
st.pop();
}
else
{
count++;
}
}
}
if (count==0)
{
cout << "yes";
}
else
{
cout << "no";
}
return 0;
}
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
18.11.2010, 17:34     Стек. Исправить ошибку #3
Вторая ошибка: надо писать, что должна делать прога.
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
18.11.2010, 18:47  [ТС]     Стек. Исправить ошибку #4
с перва должны ввести n. это длина нашего чарового массива. затем ввести знаки как "(", "[", "{", ")", "]", "}", и проверить правильно они раставленны ли. Вот простая проверка:
ввод:
6
([())]
вывод:No

ввод:
24
{[()([]{})[]]({}{{}})}[]
вывод: Yes

у меня идея такая!!! если встречается в длинне любая открвыающяяся скобка то его отправляем в стек, а если встречается закрывающяяся скобка, то сравниваем его с элементом последнего в стеки, если они семетричный, то этот знак вычеркиваем из стека, а если нет то прибавляем счетчик на один. Если в конце счетчик привышает число чем один, значит скобки расставленны не правильно.

Добавлено через 9 минут
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
#include <iostream>
#include<stack>
#include<queue>
#include<deque>
#include <string>
 
using namespace std;
 
int main()
{
    string mas;
    stack <string> st;
 
    int count=0;
    int n;
    
    cin >> n;
    cin >> mas;
 
    for (int i=0; i<n; i++)
    {
        if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
        {
            st.push(mas[i]);
        }
        if (mas[i]==')')
        {
            if (st.back=='(')
            {
                st.pop();
            }
            if (st.back=='[')
            {
                st.pop();
            }
            if (st.back=='{')
            {
                st.pop();
            }
            else
            {
                count ++;
            }
        }
    if (count==0)
    {
        cout << "yes";
    }
    else
    {
        cout << "no";
    }
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 19:18     Стек. Исправить ошибку #5
jambas92,
1) У вас стек строк, а должен быть стек символов
2) У стека нет функции back.
3) прочтите сначала хоть что-нибудь про стек.
Стек
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
18.11.2010, 19:40  [ТС]     Стек. Исправить ошибку #6
а если так??? то почему он top не читает??? исправь если сможешь...

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
#include <iostream>
#include<stack>
#include<queue>
#include<deque>
#include <string>
 
using namespace std;
 
int main()
{
    string mas;
    stack <char> st;
 
    int count=0;
    int n;
    
    cin >> n;
    cin >> mas;
 
    for (int i=0; i<n; i++)
    {
        if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
        {
            st.push(mas[i]);
        }
        if (mas[i]==')')
        {
            if (st.top=='(')
            {
                st.pop();
            }
            if (st.top=='[')
            {
                st.pop();
            }
            if (st.top=='{')
            {
                st.pop();
            }
            else
            {
                count ++;
            }
        }
    }
    if (count==0)
    {
        cout << "yes";
    }
    else
    {
        cout << "no";
    }
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 19:45     Стек. Исправить ошибку #7
jambas92, top - функция-член класса std::stack.
C++
1
if (st.top()=='(')
вот так будет читать.
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
18.11.2010, 19:51  [ТС]     Стек. Исправить ошибку #8
Forever, спасибо за подсказку, но почему моя программа не принимает таких знаков как ()[]{} ?
он сразу же вылетает, а с буквами работает нормально...

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
#include <iostream>
#include<stack>
#include<queue>
#include<deque>
#include <string>
 
using namespace std;
 
int main()
{
        char mas[1000];
        stack <char> st;
 
        int count=0;
        int n;
        
        cin >> n;
        cin >> mas;
 
        for (int i=0; i<n; i++)
        {
                if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
                {
                        st.push(mas[i]);
                }
                if (mas[i]==')')
                {
                        if (st.top()=='(')
                        {
                                st.pop();
                        }
                        if (st.top()=='[')
                        {
                                st.pop();
                        }
                        if (st.top()=='{')
                        {
                                st.pop();
                        }
                        else
                        {
                                count ++;
                        }
                }
        }
        if (count==0)
        {
                cout << "yes";
        }
        else
        {
                cout << "no";
        }
        return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 19:55     Стек. Исправить ошибку #9
jambas92, У меня не вылетает. Но работает неверно.
Поправочка. Вылетает. Код невнимательно просмотрел.

Добавлено через 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
        for (int i=0; i<n; i++)
        {
                if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
                {
                        st.push(mas[i]);
                }
                if (mas[i]==')')
                {
                        if (st.top()=='(')
                        {
                                st.pop();
                        }
                        else if (st.top()=='[')
                        {
                                st.pop();
                        }
                        else if (st.top()=='{')
                        {
                                st.pop();
                        }
                        else
                        {
                                count ++;
                        }
                }
        }
Но тем не менее вылетать будет все равно. Ибо в какой-то момент вы пытаетесь извлечь элемент из пустого стека.
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
18.11.2010, 19:58  [ТС]     Стек. Исправить ошибку #10
Forever, я же алгоритм сверху составил верный??? помоги мне его среализовать!

Добавлено через 3 минуты
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
for (int i=0; i<n; i++)
        {
                if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
                {
                        st.push(mas[i]);
                }
                if (mas[i]==')') // а где остальные варианты??? такие как ], }???
                {
                        if (st.top()=='(')
                        {
                                st.pop();
                        }
                        else if (st.top()=='[')
                        {
                                st.pop();
                        }
                        else if (st.top()=='{')
                        {
                                st.pop();
                        }
                        else
                        {
                                count ++;
                        }
                }
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2010, 20:01     Стек. Исправить ошибку
Еще ссылки по теме:

C++ Исправить ошибку
C++ Исправить ошибку C
Исправить ошибку C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 20:01     Стек. Исправить ошибку #11
jambas92, У меня к тебе такой же вопрос. Где остальные варианты?
Yandex
Объявления
18.11.2010, 20:01     Стек. Исправить ошибку
Ответ Создать тему
Опции темы

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