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

C -> C++ - C++

Восстановить пароль Регистрация
 
hofmn
Helter Skelter
 Аватар для hofmn
61 / 61 / 1
Регистрация: 19.09.2012
Сообщений: 133
04.03.2013, 16:36     C -> C++ #1
Алгоритм сортировочной станции. Нужно переписать на C++ с использованием 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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#define is_operator(c) (c == '+' || c == '-' || c == '/' || c == '*' || c == '!' || c == '%' || c == '=')
#define is_function(c) (c >= 'A' && c <= 'Z')
#define is_ident(c) ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z'))
 
bool shunting_yard(const char *input, char *output)
{
    const char *strpos = input, *strend = input + strlen(input);
    char c, stack[32], sc, *outpos = output;
    unsigned int sl = 0;
    while(strpos < strend)
    {
        c = *strpos;
        if(c != ' ')
        {
            if(is_ident(c))
            {
                *outpos = c; ++outpos;
            }
            else if(is_function(c))
            {
                stack[sl] = c;
                ++sl;
            }
            else if(c == ',')
            {
                bool pe = false;
                while(sl > 0)
                {
                    sc = stack[sl - 1];
                    if(sc == '(')
                    {
                        pe = true;
                        break;
                    }
                    else
                    {
                        *outpos = sc; ++outpos;
                        sl--;
                    }
                }
                if(!pe)
                {
                    printf("Error: separator or parentheses mismatched\n");
                    return false;
                }
            }
 
            else if(is_operator(c))
            {
                while(sl > 0)
                {
                    sc = stack[sl - 1];
 
                    if(is_operator(sc) &&
                        ((op_left_assoc(c) && (op_preced(c) <= op_preced(sc))) ||
                           (!op_left_assoc(c) && (op_preced(c) < op_preced(sc)))))
                    {
                        
                        *outpos = sc; ++outpos;
                        sl--;
                    }
                    else
                    {
                        break;
                    }
                }
  
                stack[sl] = c;
                ++sl;
            }
            
            else if(c == '(')
            {
                stack[sl] = c;
                ++sl;
            }
       
            else if(c == ')')
            {
                bool pe = false;
                while(sl > 0)
                {
                    sc = stack[sl - 1];
                    if(sc == '(')
                    {
                        pe = true;
                        break;
                    }
                    else
                    {
                        *outpos = sc; ++outpos;
                        sl--;
                    }
                }
                if(!pe)
                {
                    printf("Error: parentheses mismatched\n");
                    return false;
                }
                sl--;
                if(sl > 0)
                {
                    sc = stack[sl - 1];
                    if(is_function(sc))
                    {
                        *outpos = sc; ++outpos;
                        sl--;
                    }
                }
            }
            else
            {
                printf("Unknown token %c\n", c);
                return false;
            }
        }
        ++strpos;
    }
 
    while(sl > 0)
    {
        sc = stack[sl - 1];
        if(sc == '(' || sc == ')')
        {
            printf("Error: parentheses mismatched\n");
            return false;
        }
        *outpos = sc; ++outpos;
        --sl;
    }
    return true;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Silvestr1994
 Аватар для Silvestr1994
27 / 27 / 1
Регистрация: 26.10.2012
Сообщений: 101
04.03.2013, 19:13     C -> C++ #2
где тут STL использивать????
hofmn
Helter Skelter
 Аватар для hofmn
61 / 61 / 1
Регистрация: 19.09.2012
Сообщений: 133
05.03.2013, 20:19  [ТС]     C -> C++ #3
Цитата Сообщение от Silvestr1994 Посмотреть сообщение
где тут STL использивать????
для записи лексем в стек
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.03.2013, 22:59     C -> C++ #4
А в чем проблема?
Объявляете
C++
1
stack<char> st;
И дальше все
C
1
2
stack[sl] = c;
++sl;
Заменить на
C++
1
st.push(c);
C
1
sc = stack[sl - 1];
на
C++
1
sc = st.top();
C
1
sl--;
на
C++
1
st.pop();
hofmn
Helter Skelter
 Аватар для hofmn
61 / 61 / 1
Регистрация: 19.09.2012
Сообщений: 133
08.03.2013, 14:30  [ТС]     C -> C++ #5
diagon, а если делать под iostream, без использование char (только string)?
Еще нужно занести токены в output через пробел.

Добавлено через 12 часов 5 минут
up.

Добавлено через 9 часов 4 минуты
up.

Добавлено через 4 часа 53 минуты
up.

Добавлено через 19 часов 13 минут
up.

Добавлено через 17 часов 40 минут
up.
Yandex
Объявления
08.03.2013, 14:30     C -> C++
Ответ Создать тему
Опции темы

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