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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.71
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
#1

Баланс круглых скобок - C++

10.03.2011, 19:14. Просмотров 5627. Ответов 42
Метки нет (Все метки)

Проверить, соблюдается ли в тексте баланс круглых скобок. Для каждой открывающей скобки ‘(‘ должна быть найдена соответствующая закрывающая ‘)’.

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

Помогите люди добрые!!Со строками вообще проблема...не знаю как!!Помогите пожалуйста!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2011, 19:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Баланс круглых скобок (C++):

Проверить баланс круглых скобок, используя очередь - C++
Добрый день. Преподавателем поставлена следующая задача: дан текстовый файл с программой на алгоритмическом языке. За один просмотр...

Проверить правильность расположения круглых скобок - C++
Пусть задано множество строк. Проверить правильность расположения круглых скобок. Если скобки расположыне правильно, то последовательно...

Перегрузка круглых скобок как ravalue - C++
Не могу понять, как перегрузить () для того чтобы можно было использовать a(1, 2)=2; вместо a=3; ошибся, наверное не rvalue, а...

Баланс скобок - C++
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю #include <stdio.h> #include <stdlib.h> #include <conio.h> ...

Баланс скобок - C++
Люди может укажите мне на ошибку в программе по которой не находит баланс..? #include<iostream.h> #include<string.h> ...

Баланс скобок - C++
проверить правильность расстановки скобок, используя контейнерные типы(стек)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:12  [ТС] #31
lavan, это как?извините,не очень понятно и куда это писать?
lavan
52 / 52 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:15 #32
учитываем возможность пустого ввода
C++
1
2
3
//был ввод теперь проверяем
int size=string.size();
if(size==0)cout<<"сторка пуста";
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:16  [ТС] #33
ВСЁ!!Я ИСПРАВИЛА !!вот так...
C++
1
2
3
4
5
6
7
8
9
10
int main()
 {
int k ;
cout<<" Vvedite kol-vo strok: " ;
cin>>k ;
for ( ; k>0 ;k-- )
   analize();
 
  return 0;
}
lavan
52 / 52 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:16 #34
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
 {
int kol ;
cout<<" Vvedite kol-vo strok: " ;
cin>>kol ;
kol--;
for (int w=0 ; w<kol ; w++ )
   analize();
 
  return 0;
}
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:17  [ТС] #35
так работает...вроде)
lavan
52 / 52 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:18 #36
а теперь в ваш "иправленный код " введите 1
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:23  [ТС] #37
аа...нее...не работает...

Добавлено через 42 секунды
да оно вообще не работает!!!во всех строках ни смотря ни на что пишет -нет баланса!

Добавлено через 1 минуту
пробейте в билдере...он сразу пишет на первую строку без ее ввода - нет баланса..и потом на остальные тоже!

Добавлено через 1 минуту
lavan, вы в своем коде ничего не сделали ..только чтобы джля 1 строки...но как он у вас вообще работает!если для одной строки он сразу выдает(БЕЗ ЕЕ ВВОДА!!!) -нет баланса!
lavan
52 / 52 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:36 #38
вместо того чтобы нервничать,нужну не много подумать я вам все сделал.нужно это просто скомпонавать
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
#include<iostream>
#include<string>
using namespace std;
void analize();
static int c=1;
int main() {
        analize();
        analize();
        cin.get();
        return 0;
}
void analize() {
        string str;
        int bz;
         cout<<"Vvedi stroky "<<c<<":";
         short otkr=0,zakr=0;
        getline(cin,str);
        if(!str.size()) {
            cout<<"stroka pysta\n";
            return;
        }
        for(int i=0;i<str.size();i++) {
        if(str[i]=='(')
        otkr++;
        else if(str[i]==')')
        zakr++;
        if(zakr>otkr) {
        bz++;
        break;
        }
                }
 
                if(otkr==zakr &&bz==0)
                cout<<"est balans";
                else if(bz>0)
                 cout<<"net balansa";
                else if(otkr!=zakr)
                cout<<"net balansa";
                else if(otkr==0 && zakr==0)
                cout<<"skobok net";
                cout<<endl;
 
        c++;
}
просто забейте это в компилятор
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
17.03.2011, 23:39  [ТС] #39
lavan, спасибо большое!но у мення это и так работает.)
вот видите у вас в main только 2 раза функция вызывается,а я хочу чтобы ее можно было вызвать столько сколько душе захочется.ну и вот-тогда все и не работает(
lavan
52 / 52 / 1
Регистрация: 21.03.2009
Сообщений: 371
17.03.2011, 23:49 #40
C++
1
2
3
4
5
6
7
short r;
cout<<"Vvedi kol strok:";
cin>>r;
r--;
cin.get();//poimali '\n'
for(int i=0;i<r;i++)
    analize();
barlog
2 / 2 / 0
Регистрация: 03.11.2009
Сообщений: 227
18.03.2011, 00:09  [ТС] #41
а у меня не работает(
ладно...пойду еще поробую..всем спасибо!!!)

Добавлено через 16 минут
lavan, a вф попробуйте переписать используя только просто char str[size] , gets(str)...
вообще ничего работать не будут..отчего?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.03.2011, 00:33 #42
Что-то не увидел здесь одного из самых популярных вариантов...
Понимаю, что говорили делать без STL, но реализовать свой стек не является трудной задачей.
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>
#include <string>
 
bool laysCheck(const std::string& str)
{
     std::stack<char> lays;
     for(std::string::const_iterator iter=str.begin(); 
          iter != str.end(); ++iter)
     {
          if(*iter == '(')
             lays.push(*iter);
          else if(*iter == ')' && !lays.empty())
             lays.pop();
     }
     return lays.empty();
}
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::cout<<(laysCheck(str) ? "Yes" : "No")<<'\n';
    return 0;
}
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
18.03.2011, 07:17 #43

Не по теме:

ForEveR, ну так сделал бы чтоб сразу и квадратные, и круглые, и фигурные скобки считались



Добавлено через 3 минуты
Кстати, реализация неправильная - для примера введи ")"

Добавлено через 31 минуту
Как-то так:
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
#include <iostream>
#include <cstdlib>
#include <stack>
 
bool is_balanced(const char*);
bool is_opening_bracket(char);
bool is_closing_bracket(char);
char opening_bracket(char);
 
int main(int argc, char* argv[])
{
    if(argc == 1)
    {
    std::cerr << "No input" << std::endl;
    return EXIT_FAILURE;
    }
 
    for(size_t i = 1; i < argc; ++i)
    std::cout << argv[i] << ": "
          << (is_balanced(argv[i]) ? "balanced" : "unbalanced")
          << std::endl;
 
    return EXIT_SUCCESS;
}
 
bool is_balanced(const char* expr)
{
    std::stack<char> stk;
 
    for( ; *expr; ++expr)
    {
    if(is_opening_bracket(*expr))
        stk.push(*expr);
    else if(is_closing_bracket(*expr))
    {
        if(stk.empty() || stk.top() != opening_bracket(*expr))
        return false;
        else
        stk.pop();
    }
    }
 
    return stk.empty();
}
 
bool is_opening_bracket(char ch)
{
    switch(ch)
    {
    case '(':
    case '{':
    case '[':
    case '<':
    return true;
 
    default:
    return false;
    }
}
 
bool is_closing_bracket(char ch)
{
    switch(ch)
    {
    case ')':
    case '}':
    case ']':
    case '>':
    return true;
 
    default:
    return false;
    }
}
 
char opening_bracket(char ch)
{
    switch(ch)
    {
    case ')':
    return '(';
 
    case '}':
    return '{';
 
    case ']':
    return '[';
 
    case '>':
    return '<';
 
    default:
    return 0;
    }
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
nameless@nameless-desktop:~/cpp-sample$ ./cpp-sample 
No input
nameless@nameless-desktop:~/cpp-sample$ ./cpp-sample \
> "()[{<k>}(foo)bar]" \
> ")ba" \
> "ab)" \
> "(abc)" \
> "(()((()))(()))" \
> "(this{is{another}balanced[bracket<expression>for]sure})" \
> "[but(this>one<is)not]"
``()[{<k>}(foo)bar]``: balanced
``)ba``: unbalanced
``ab)``: unbalanced
``(abc)``: balanced
``(()((()))(()))``: balanced
``(this{is{another}balanced[bracket<expression>for]sure})``: balanced
``[but(this>one<is)not]``: unbalanced
nameless@nameless-desktop:~/cpp-sample$
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2011, 07:17
Привет! Вот еще темы с ответами:

Баланс скобок - C++
Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов...

Баланс скобок - C++
Помогите пожалуйста!!! Собственно задание: Текст в файле содержит многократно вложенные круглые скобки. Если баланс скобок соблюден,...

Строки. Проверить правильность задания круглых скобок - C++
Проверить, правильно ли в заданном тексте расставлены круглые скобки (т. е. находится ли справа от каждой открывающей скобки...

Проверить правильность расстановки в тексте круглых скобок - C++
Задача: Проверить правильность расстановки в тексте круглых скобок. #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace...


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

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

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