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

Очередь - C++

Восстановить пароль Регистрация
 
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
20.06.2011, 16:00     Очередь #1
Здравствуйте, Уважаемые форумчане

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

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

Есть идеи, как решить её можно ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 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);
    }
}
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
20.06.2011, 18:07  [ТС]     Очередь #3
xAtom, Спасибо тебе огромное и на этом
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
24.06.2011, 21:33  [ТС]     Очередь #4
xAtom, дружище, преподаватель сказал, что очереди тут нету Помоги пожалуйста ещё раз

Добавлено через 16 секунд
В чём же ошибка ?
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
02.07.2011, 20:43  [ТС]     Очередь #5
Ребят, помогите пожалуйста. Нет тут очереди к сожалению
accept
4837 / 3236 / 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.
похоже, что очередь нужна для самих пар
так-то закрывающие скобки можно находить с помощью стека
с помощью стека можно определить правильные закрывающие скобки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2011, 14:24     Очередь
Еще ссылки по теме:

Создать очередь. Добавить элемент в очередь. Удалить элемент из очереди C++
Очередь, теория. Очередь на шести стеках C++

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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]$
Yandex
Объявления
03.07.2011, 14:24     Очередь
Ответ Создать тему
Опции темы

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