Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5

Реализация стек-строки

01.11.2009, 00:32. Показов 1074. Ответов 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
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
#include <iostream>
#include <string>
 
#define str string
#define sz(x) (x.size())
 
using namespace std;
 
int main()
{
    int n, a = 0, b = 0, c = 0;
    str s, stek;
 
    cin >> n >> s;
    s += '$';
    stek += '$';
 
    for (int i = 0; i < n; ++i)
    {
        //проверка количества закрывающихся и открывающихся скобок
        if (s[i] == '(') ++a;
        else if (s[i] == '[') ++b;
        else if (s[i] == '{') ++c;
        else if (s[i] == ')') --a;
        else if (s[i] == ']') --b;
        else if (s[i] == '}') --c;
 
        //создание стека
        if (s[i] == '(' || s[i] == '[' || s[i] == '{')
            stek += s[i];
 
        //вывод текущего элемента стека
        cout << stek[ sz(stek)-1 ] << endl;
    
        //проверка на сопоставления скобок
        if (s[i] == ')' && stek[k] != '(') {
                cout << "No" << endl;
                return 0;
            }
        else if (s[i] == ')') stek[ sz(stek)-1 ] = '/0';
 
        if (s[i] == ']' && stek[k] != '[') {
                cout << "No" << endl;
                return 0;
            }
        else if (s[i] == ']') stek[ sz(stek)-1 ] = '/0';
        
        if (s[i] == '}' && stek[k] != '{') {
                cout << "No" << endl;
                return 0;
            }
        else if (s[i] == '}') stek[ sz(stek)-1 ] = '/0';
    }
        
 
    if (a != 0 || b != 0 || c != 0) cout << "No" << endl;
    else cout << "Yes" << endl; 
 
    return 0;
}
), но она при вводе строки ({}) записывает в стек-строку ({ и после удаления последнего элемента все ровно выдает {.

Нужно делать это на C++ а не на C, там это канает.. Просьба помочь, если знаете, и по меньше флудить..

Добавлено через 12 минут
Оказывается на C++ для подобных нужд есть substr(), вот мой
изменившийся код
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
#include <iostream>
#include <string>
 
#define str string
#define sz(x) (x.size())
 
using namespace std;
 
int main()
{
    int n, a = 0, b = 0, c = 0;
    str s, stek;
 
    cin >> n >> s;
    s += '$';
    stek += '$';
 
    for (int i = 0; i < n; ++i)
    {
        //проверка количества закрывающихся и открывающихся скобок
        if (s[i] == '(') ++a;
        else if (s[i] == '[') ++b;
        else if (s[i] == '{') ++c;
        else if (s[i] == ')') --a;
        else if (s[i] == ']') --b;
        else if (s[i] == '}') --c;
 
        //создание стека
        if (s[i] == '(' || s[i] == '[' || s[i] == '{')
            stek += s[i];
 
        //вывод текущего элемента стека
        //cout << stek[ sz(stek)-1 ] << endl;
    
        //проверка на сопоставления скобок
        if (s[i] == ')' && stek[ sz(stek)-1 ] != '(') {
                cout << "No" << endl;
                return 0;
            }
        else if (s[i] == ')') stek = stek.substr(0, sz(stek)-1 );
 
        if (s[i] == ']' && stek[ sz(stek)-1 ] != '[') {
                cout << "No" << endl;
                return 0;
            }
        else if (s[i] == ']') stek = stek.substr(0, sz(stek)-1 );
        
        if (s[i] == '}' && stek[ sz(stek)-1 ] != '{') {
                cout << "No" << endl;
                return 0;
            }
        else if (s[i] == '}') stek = stek.substr(0, sz(stek)-1 );
    }
    s.substr()
 
    if (a != 0 || b != 0 || c != 0) cout << "No" << endl;
    else cout << "Yes" << endl; 
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2009, 00:32
Ответы с готовыми решениями:

Стек!!!Реализация.
Написать библиотеку функций для стека: 1 Инициализация 2Копирование стека 2Добавления 3Удаление элемента 4Печать 5Удаление...

Стек реализация JavaScript
Не могу найти ошибку в коде, а завтра надо сдать. заранее спасибо за помощь var Top; var maxsize=50; var x; function Empty(){ ...

Очередь, стек, дерево? (реализация)
Всем привет, помогите пожалуйста в реализации очереди дерева и стека(Не понимаю совсем(((( Добавлено через 3 минуты Блин да...

3
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
01.11.2009, 16:45
Ты бы задачу сначала описал подробнее.
0
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
02.11.2009, 13:21
вообще, для контроля скобок на мой взгляд удобнее использовать не строку а полноценный стек
напимер вот такой:
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
#ifndef HSTACK
#define HSTACK
 
#include <iostream>
using namespace std;
 
template < typename T> class Stack
{
private:
    int size; //# of elements
    int top; // позиция верхнего елемента
    T* stackPtr;// указатель на стек
 
public:
    Stack (int = 10); //default constructor
    ~Stack()
    {
        delete [] stackPtr;
    }
    bool push (const T&); // затолкнуть в стек
 
    bool pop (T&); // вытолкнуть из стека
 
    bool isEmpty() const
    {
        return top == -1;
    }
 
    bool isFull() const
    {
        return top == size - 1;
    }
};
 
 
template <typename T> Stack <T>::Stack(int s) : size(s > 0 ? s : 10), top(-1), stackPtr( new T[size] ) //конструктор
{
}
 
template <typename T> bool Stack<T>::push(const T& pushValue)
{
    if ( !isFull() )
    {
        stackPtr[++top] = pushValue;
        return true;
    }
    return false;
}
 
template <typename T> bool Stack<T>::pop(T& popValue)
{
    if ( !isEmpty() )
    {
        popValue = stackPtr[top--];
        return true;
    }
    return false;
}
#endif
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
06.11.2009, 22:07  [ТС]
ничего не имею против вашего примера, но, короче вот задача: http://194.146.140.53/problem-pid-c372?ps=15&smt=8
я ее решил вышеприведенным способом, если ваш вариант проканает скиньте решение мне на мыло, пожалуйста..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2009, 22:07
Помогаю со студенческими работами здесь

Реализация стек разными способами
Требуется реализовать стек разными способами (требуется три программы): 1) Стек фиксированного размера на массиве 2)...

Реализация класса стек через указатели
Хочу написать свой класс Стек, используя не массив, а указатели.... в С++ с этим проблем более-менее уже нет, а вот в C#.... в шарпе...

Стек, очередь, дек - ИДЕЯ (реализация?)
Задание лабораторки: Хочу создать программу про Библиотеку (типа жизненный пример) Три groupBox'a: СТЕК - Сдача книг (как...

Реализация АТД стек на базе связного списка
Здравствуйте, очень прошу вашей помощи. Необходимо реализовать стек на базе связного списка, а я совершенно не понимаю как это сделать....

Стек: реализация алгоритма с вычислением значения введенного выражения
Адаптировать код чтобы эти условия правильно выполнялись 6) R=(a+b)*(c-d)/e a=1 b=4 c=8 d=6 e=4, R=2.5 ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru