Второй стек печатает пустой, используя GList - PullRequest
0 голосов
/ 20 апреля 2020

Я реализую эту структуру данных (от инфикса к постфиксу), используя стек.

По сути, я тестирую с pu sh и печатью, без операции pop. Первый стек ie., stack содержит оператор и числа, а второй стек stack_precedence записывает приоритет. Я думаю, что оба стека работают нормально, но я не понимаю, почему стек приоритетов не печатает номера приоритетов и вместо этого возвращает пустой вывод.

Частичная реализация:

#include <iostream>
#include <glib.h>

using namespace std;

int main(int argc, char *argv[])
{
        GList *stack = nullptr;
        GList *stack_precedence = nullptr;

        int size = 0;
        for (int i = 0; argv[1][i] != '\0'; i++) {
                int precedence = 0;
                bool is_precedence_set = false;
                switch (argv[1][i]) {
                /*
                 * Precedence order:
                 * 3) ^
                 * 2) / *
                 * 1) + -
                 * 0) ( )
                 */
                case '^':
                        precedence = 3;
                        is_precedence_set = true;
                case '/':
                case '*':
                        if (!is_precedence_set) {
                                precedence = 2;
                                is_precedence_set = true;
                        }
                case '+':
                case '-':
                        if (!is_precedence_set) {
                                precedence = 1;
                                is_precedence_set = true;
                        }
                case '(':
                        if (!is_precedence_set) {
                                precedence = 0;
                                is_precedence_set = true;
                        }

                        stack = g_list_append(
                                        stack, GINT_TO_POINTER(argv[1][i]));
                        stack_precedence = g_list_append(
                                        stack_precedence, GINT_TO_POINTER(precedence));
                        size++;
                        break;
                case ')':
                        if (!is_precedence_set) {
                                precedence = 0;
                                is_precedence_set = true;
                        }
                        break;
                default:
                        if (argv[1][i] >= '0' and argv[1][i] <= '9') {
                                precedence = 9;
                                stack = g_list_append(
                                                stack, GINT_TO_POINTER(argv[1][i]));
                                stack_precedence = g_list_append(
                                                stack_precedence, GINT_TO_POINTER(precedence));
                                size++;
                        }
                }
        }

        cout << "Stack size: " << size << endl;

        stack = g_list_first(stack);
        while (stack != nullptr) {
                char c = GPOINTER_TO_INT(stack->data);
                cout << c;
                stack = g_list_next(stack);
        }
        cout << endl;

        stack_precedence = g_list_first(stack_precedence);
        while (stack_precedence != nullptr) {
                char c = GPOINTER_TO_INT(stack_precedence->data);
                cout << c;
                stack_precedence = g_list_next(stack_precedence);
        }
        cout << endl;

        return 0;
}

Я передаю 2+ 2 в качестве аргумента моей программы и stack точно печатает 2 + 2, но stack_precedence возвращает пустое значение.

Мой ожидаемый результат -

2 + 2 919

а не

2 + 2 пусто

1 Ответ

1 голос
/ 20 апреля 2020

Прецеденты являются целыми числами, а не символами

int c = GPOINTER_TO_INT(stack_precedence->data);
^^^ change here
...