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

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

Войти
Регистрация
Восстановить пароль
 
Vitusja
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
#1

на основе стеков..... на С++ - C++

23.10.2011, 21:37. Просмотров 385. Ответов 8
Метки нет (Все метки)

Всем привет!!!
Нужна ваша помощь....


Проверить в выражении баланс скобок «(« и «)«.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2011, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос на основе стеков..... на С++ (C++):

Пример использование стека на основе массива и на основе двунаправленного списка - C++
здраствуте, можете привести примеры использывания стека на основе массива(1 код) и стек на основе двунаправленного списка(2...

из 2-х стеков в один - C++
Подскажите, пожалуйста, есть такая задача: Дано 2 стека, элементы которых упорядочены по возрастанию. Создать 3-й стек из 2-х заданных в...

Передача стеков - C++
Немного глупый вопрос, но всё же. Как нужно переписывать стек в стек? Т.е. у меня есть 2 стека. к примеру в стеке с именем Stack1 будет...

Реализация k-стеков - C++
Добрый день! Никак не могу найти информацию по реализации k-стеков. Задача состоит в следующем: 1. описать объектовый тип стек и взять...

Из двух стеков в один - C++
Привет всем!) У меня есть вто такое задание : Using C++ functions written during the class, write C++ program that creates stacks A, B,...

Разработайте класс стеков - C++
Разработайте класс стеков для хранения символов с реализацией в виде массива. Создать стек и заполнить его произвольными символами ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
23.10.2011, 22:05 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
int main()
{
    std::string s;
    getline(std::cin, s);
    int balance = 0;
    for(size_t i = 0; i < s.size(); i++)
        if(s[i] == '(')
            balance--;
        else if(s[i] == ')')
            balance++;
    if(balance)
        std::cout << "Unbalanced brackets!" << std::endl;
    else
        std::cout << "Normal expression" << std::endl;
    return 0;
}
не на основе стека

Добавлено через 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
#include <iostream>
#include <stack>
 
int main()
{
    std::stack<char> st;
    char ch;
    while((ch = std::cin.get()) != -1)
        st.push(ch);
    int bal = 0;
    while(!st.empty())
    {
        if(st.top() == '(')
            bal--;
        else if(st.top() == ')')
            bal++;
        st.pop();
    }
    if(bal)
        std::cout << "Unbalanced";
    else
        std::cout << "Normal";
    std::cout << std::endl;
    return 0;
}
признак конца ввода Girl+Z

Не по теме:

стек здесь просто для того, что так сказано в условии. Это НЕВЕРНОЕ использование стека


Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
23.10.2011, 22:14 #3
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <algorithm>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::cout<<(std::count(str.begin(),str.end(),'(')==std::count(str.begin(),str.end(),')') ? "Good\n" : "Bad\n");
    system("pause");
    return 0;
}
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
23.10.2011, 22:22 #4
ну это не совсем так
иначе (()))( тоже пройдет
из примера Mayonez
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
#include <iostream>
#include <string>
 
int main()
{
        std::string s;
        getline(std::cin, s);
        int balance = 0;
        for(size_t i = 0; i < s.size(); i++)
                if(s[i] == '(')
                        balance--;
                else if(s[i] == ')')
                {
                    balance++;
                    if (balance > 0)
                    {
                       break;
                    }
                }
        if(balance)
                std::cout << "Unbalanced brackets!" << std::endl;
        else
                std::cout << "Normal expression" << std::endl;
        return 0;
}
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
23.10.2011, 22:25 #5
alex_x_x, я немного не верно прочитал условие. Подумал что нужно просто проверить количество скобок.
Vitusja
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
23.10.2011, 23:42  [ТС] #6
Всем огромное спасибо)))
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
24.10.2011, 00:07 #7
alex_x_x, переделал, должно работать:
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
#include <iostream>
#include <string>
#include <stack>
 
using namespace std;
 
int main()
{
    string s;
    getline(cin, s);
    stack<char> st;
    bool f = 1;
    for(size_t i = 0; i < s.size(); i++)
    {
        if(s[i] == '(')
            st.push(s[i]);
        else if(s[i] == ')')
        {
            if(st.empty() || st.top() != '(')
            {
                f = 0;
                break;
            }
            else
                st.pop();
        }
    }
    if(f && st.empty())
        cout << "good";
    else
        cout << "bad";
    cout << endl;
    return 0;
}
Vitusja
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
24.10.2011, 00:18  [ТС] #8
еще один вопросик.... но не по теме..

[Linker Fatal Error] Fatal: Expected a file name
Что делать???

в Project->Options ->Directories/Conditionals все указано правильно.... что только не пробовала.... одно и тоже - не компилирует((
Windows переустанавливать что ли???
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
24.10.2011, 07:00 #9
Цитата Сообщение от Mayonez Посмотреть сообщение
стек здесь просто для того, что так сказано в условии. Это НЕВЕРНОЕ использование стека
По-моему как раз само то) Я бы так сделал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<stack>
 
int main(){
    std::stack<char> brackets;
    std::string str;
    std::getline(std::cin, str);
    for(int i=0; i<str.length(); i++){
        if(str[i] == '(')
            brackets.push(str[i]);
        else if(!brackets.empty())
            brackets.pop();
        else {
            std::cout<<"Unbalance in "<<i+1<<" brackets"<<std::endl;
            return 0;
        }
    }
    std::cout<<(brackets.empty() ? "Balance OK!" : "Balance not OK, unnecessary left brackets")<<std::endl;
    return 0;
}
без проверки на "левые" символы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 07:00
Привет! Вот еще темы с ответами:

Конкатенация (присоединение) стеков - C++
Привет всем, я имею код конкатинации (присоединения) строки в другую строку. Мне нужно его переделать не для строки а для стека!!! И все,...

Сравнение элементов стеков - C++
Даны два стека. Задача состоит в том, чтобы создать третий стек из элементов первого, которых нет во втором. Не могу найти ошибку,...

Создание нескольких стеков - C++
//--------------------------------------------------------------------------- #pragma hdrstop #include &lt;tchar.h&gt; #include...

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


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

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

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