【问题标题】:Second stack prints blank using GList第二个堆栈使用 GList 打印空白
【发布时间】:2020-04-20 12:06:11
【问题描述】:

我正在使用堆栈实现这个数据结构(中缀到后缀)。

基本上,我正在测试推送和打印,没有弹出操作。第一个堆栈,即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
空白

【问题讨论】:

    标签: c++ stack glib


    【解决方案1】:

    优先级是整数而不是字符

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

    【讨论】:

    • 但是,我有点困惑...第一个堆栈 2+2 打印成功。 2如何打印?因为它是一个int
    • @KeyikedalubeNdang 不,不是,这是一个角色。你有char *argv[] 所以argv[1][i] 是一个字符。但是int precedence = 0; 显然是一个整数。您必须注意 C++ 中的类型。
    • 再次感谢@john ;) 在昨天尝试解决这个问题两个小时后,我的头撞在了键盘上。现在我很新鲜。我需要更多地关注类型。
    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2018-07-06
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多