Преобразование постфиксной записи в инфиксную с использованием стека массивов

Я пытаюсь написать программу для преобразования постфиксной записи в инфиксную, но мне это не легко.

pfix  stack          explanation (@ is space)  
---------------------------------------------  
3     3  
4     3 4  
5     3 4 5  
+     3 (4@+@5)      if exp[i] is op, do some action  
*     (3@*@(4@+@5))  if exp[i] is op, do some action  

Некоторое действие означает, что оно дважды извлекается из стека, вставляется «пробел+оператор+пробел» и заключается в круглые скобки. Затем вставьте его в стек.

Но когда я запускаю эту программу, она вообще не работает.

cygwin_exception::open_stackdumpfile: Выгрузка трассировки стека в post2in.exe.stackdump

Как я могу это исправить?

Спасибо.

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define M 20
#define N 20

char stk[M][N];  // array of string
int top = -1;

void push(char (*)[N], char *);
char *pop(char (*)[N]);
void getexp(char *);
int isop(char);

int main() {
  char *exp = "abc+*";
  getexp(exp);
  printf("%s ", *stk[0]);
  return 0;
}

void getexp(char *exp) {
  while (*exp = '\0') {

    /* if space or tab, skip */
    if (*exp == ' ' || *exp == '\t') exp++;

    /* if digit or point, get whole number and store it into array stack */
    else if (isdigit(*exp) || *exp == '.') {
      char digits[20];
      int i = 0;
      while (*exp != ' ' && *exp != '\0') {
        digits[i++] = *exp++;
      }
      digits[i] = '\0';
      push(stk, digits);
    }

    /* if operator, pop twice and wrap them with parenthesis with operator */
    else if (isop(*exp)) {
      char bwparens[20], pop1[20], pop2[20], temp[4];
      strcpy(pop2, pop(stk));
      strcpy(pop1, pop(stk));
      temp[0] = ' ';
      temp[1] = *exp;
      temp[2] = ' ';
      temp[3] = '\0';
      bwparens[0] = '(';
      strcat(strcat(strcat(bwparens, pop1), temp), ")\0");
      push(stk, bwparens);
      exp++;
    }
  }
}

int isop(char chr) {
  return (chr == '+' || chr == '-' || chr == '*' || chr == '/' || chr == '%');
}

void push(char stk[M][N], char *exp) {
  if (top == -1) {
    printf("Stack is full");
    exit(EXIT_FAILURE);
  } else
    strcpy(stk[++top], exp);
}

char *pop(char stk[M][N]) {
  if (top == -1) {
    printf("Stack is empty.\n");
    exit(EXIT_FAILURE);
  } else {
    return stk[top--];
  }
}

person Larynx    schedule 31.12.2019    source источник
comment
Используйте отладчик, чтобы выяснить, где срабатывает исключение, а затем используйте его для отслеживания и проверки выполнения кода.   -  person kaylum    schedule 31.12.2019
comment
strcat(bwparens, pop1) не работает, так как bwparens не является строкой.   -  person chux - Reinstate Monica    schedule 31.12.2019


Ответы (1)


Вы устанавливаете exp всегда равным нулевому завершению, и это приводит к бесконечному циклу:

while (*exp = '\0')

Я думаю, что это может быть одним из вопросов.

Я надеюсь, что это помогает.

person bhristov    schedule 31.12.2019