Я реализую эту структуру данных (от инфикса к постфиксу), используя стек.
По сути, я тестирую с 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 пусто