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

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

Войти
Регистрация
Восстановить пароль
 
Uinslou
Старичок :)
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
#1

Очередь - C++

20.06.2011, 16:00. Просмотров 926. Ответов 6
Метки нет (Все метки)

Здравствуйте, Уважаемые форумчане

Вот есть такая задача:

Используя очередь, решить задачу: в файле находится текст, сбалансированный по круглым скобкам. Требуется для каждой пары соответствующих открывающей и закрывающей скобок напечатать номера их позиций в тексе, упорядочив пары номеров по возрастанию номеров позиций открывающих скобок. Например, для текса a+(45-f(x)*(b-c)) надо напечатать 3 17, 8 10, 12 16.

Есть идеи, как решить её можно ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2011, 16:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очередь (C++):

Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете - C++
Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете. В каждый момент времени происходит одно из событий:...

Очередь (сделать очередь, чтобы добавляло, удаляло, читало. Не STL.) - C++
Помогите пожалуйста написать очередь. Есть Температура double и ее тип int ну и нужно сделать очередь, чтобы добавляло, удаляло, читало....

Задача на очередь (вывод сообщения, что очередь пуста) - C++
Доброго дня! Есть задачка на очередь, которая работает нормально, только надо добавить код, чтобы выводил сообщение, что очередь пуста.....

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

Создать очередь. Добавить элемент в очередь. Удалить элемент из очереди - C++
Нужно создать очередь. Добавить элемент в очередь. Удалить элемент из очереди. Вот моё "творение". int main() { int...

Очередь - C++
Привет всем. Я тут решаю в общем то простое упражнение - нужно проверить переполнение и опустошение очереди. Есть у меня небольшая...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
20.06.2011, 17:58 #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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// подсчёт кол-во скобок
int c_len(const char* str) {
    int len = 0;
    while( *str ) {
         if( *str++ == '(' )
            len++;
    }
    return len;
}
 
// парсер возвращает позиции
int c_pos(const char* str, int start, int& first, int& last) {
    int cnt = 0, pos = 0;
    char ch = 0;
    for(int i = start; *((str) + i) != '\0'; i++) {
        if( *((str) + i) == '(' && ch != '(' ) {
            ch = *((str) + i);
            pos = i;
                                  cnt++;
        } else {
            if( *((str) + i) == '(' )
                cnt++;
            else if( *((str) + i) == ')' ) {
                if(ch == '(')   {
                       cnt--;
                       if(cnt <= 0) {
                       last = i + 1;
                       break;
                       }
                }
            }
        }
    }
    first = pos + 1;
    return  pos + 1;
}
 
 
 
 
 void  main(void){
 
    const char*  str = "a+(45-f(x)*(b-c))";
    int cur = 0, first = 0, last = 0;
   
    int  sz = c_len(str);
    while( sz-- ) {
        cur = c_pos(str, cur, first, last);
        printf("pos first = %d, pos last = %d\n", first, last);
    }
    
    //  ещё проверка
    puts("");
 
    str   = "(2*(5+5))-(2+2)";
    cur  = 0;
    sz   = c_len(str);
    while( sz-- ) {
        cur = c_pos(str, cur, first, last);
        printf("first = %d, last = %d\n", first, last);
    }
}
1
Uinslou
Старичок :)
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
20.06.2011, 18:07  [ТС] #3
xAtom, Спасибо тебе огромное и на этом
0
Uinslou
Старичок :)
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
24.06.2011, 21:33  [ТС] #4
xAtom, дружище, преподаватель сказал, что очереди тут нету Помоги пожалуйста ещё раз

Добавлено через 16 секунд
В чём же ошибка ?
0
Uinslou
Старичок :)
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
02.07.2011, 20:43  [ТС] #5
Ребят, помогите пожалуйста. Нет тут очереди к сожалению
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2011, 10:23 #6
Цитата Сообщение от Uinslou
Например, для текса a+(45-f(x)*(b-c)) надо напечатать 3 17, 8 10, 12 16.
похоже, что очередь нужна для самих пар
так-то закрывающие скобки можно находить с помощью стека
с помощью стека можно определить правильные закрывающие скобки
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
03.07.2011, 14:24 #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
75
#include <iostream>
#include <cstdlib>
#include <stack>
#include <vector>
#include <stdexcept>
#include <utility>
#include <algorithm>
 
void print_brackets(const char*) throw(std::runtime_error);
 
int main(int argc, char* argv[])
{
    if(argc == 1)
    {
    std::cerr << "Usage: " << *argv << " EXPRESSION ..." << std::endl;
    return 1;
    }
 
    for(size_t i = 1; i < argc; ++i)
    {
    try
    {
        std::cout << "Processing expression `" << argv[i] << "'..." << std::endl;
        print_brackets(argv[i]);
    }
    catch(std::exception& e)
    {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    }
    
    return 0;
}
 
void print_brackets(const char* str) throw(std::runtime_error)
{
    std::stack<size_t> opening_brackets;
    std::vector<std::pair<size_t, size_t> > bracket_pairs;
 
    const char* start = str;
    
    while(*str)
    {
    if(*str == '(')
        opening_brackets.push(str - start + 1);
    else if(*str == ')')
    {
        if(opening_brackets.empty())
        throw std::runtime_error("Unbalanced bracket expression");
        bracket_pairs.push_back(std::make_pair(opening_brackets.top(), str - start + 1));
        opening_brackets.pop();
    }
    ++str;
    }
 
    std::sort(bracket_pairs.begin(),
          bracket_pairs.end(),
          [](const std::pair<size_t, size_t>& br1,
         const std::pair<size_t, size_t>& br2)
    {
    return br1.first < br2.first;
    });
        
    if(!opening_brackets.empty())
    throw std::runtime_error("Unbalanced bracket expression");
 
 
    for(std::vector<std::pair<size_t, size_t> >::const_iterator it = bracket_pairs.begin();
    it != bracket_pairs.end();
    ++it)
    std::cout << it->first << " " << it->second
          << (it + 1 == bracket_pairs.end() ? "" : ", ");
              
    std::cout << std::endl;
}
Код
[nameless@laptop cpp-sample]$ ./cpp-sample \
> 'a+(45-f(x)*(b-c))' \
> '(invalid(bracket)expression' \
> 'fact(n) = (n == 0 ? 1 : fact(n - 1) * n)'
Processing expression `a+(45-f(x)*(b-c))'...
3 17, 8 10, 12 16
Processing expression `(invalid(bracket)expression'...
Error: Unbalanced bracket expression
Processing expression `fact(n) = (n == 0 ? 1 : fact(n - 1) * n)'...
5 7, 11 40, 29 35
[nameless@laptop cpp-sample]$
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2011, 14:24
Привет! Вот еще темы с ответами:

Очередь? What - C++
Всем доброго время суток.Дело в том, что с трудом дается с++, но очень хочется стать программистом.Вообщем ничего толком не объяснив препод...

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

Очередь - C++
Здрасти всем... Не могу понять как организовать 2 очереди для данной задачи и не понятно как реализоваться функцию суммы .. ...

Очередь - C++
Всем привет! Вопрос: целесообразно ли перегружать для очереди операторы ввода/вывода и оператор , для произвольного доступа к елементам ?...


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

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

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