2017-01-26 3 views
0

Я скомпилировал программу, которая переводит инфиксную нотацию в постфиксную нотацию, а потом я получил эти «?». внутри вертикальных прямоугольников. Я на компьютере с Windows и с помощью GNU gcc для компиляции.Вопросительные знаки внутри вертикальных прямоугольников после компиляции?

Может кто-нибудь объяснить мне, для чего нужны вопросительные знаки или почему они появились?

Я предоставлю код, который у меня есть.

stack.h

typedef struct Stack { 
    int top; 
    int MAXSTACKSIZE; 
    int * stk; 
} Stack; 

void InitializeStack(Stack * stack, int length); 
int Precedence(char symbol); 
void Push(Stack * stack, int element); 
int Pop(Stack * stack); 
int Top(Stack * stack); 
int Size_S(Stack * stack); 
int isEmpty(Stack * stack); 
void Convert(Stack * stack, char infix[], char postfix[]); 
void PrintStack(Stack * stack); 

stack.c

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

void InitializeStack(Stack * stack, int length) { 
    stack -> stk = malloc(sizeof(int) * length); 
    stack -> MAXSTACKSIZE = length; 
    stack -> top = -1; 
} 

int Precedence(char symbol) { 
    if (symbol == '^') { 
     return 3; 
    } else if (symbol == '*' || symbol == '/' || symbol == '%') { 
     return 2; 
    } else if (symbol == '+' || symbol == '-') { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

void Push(Stack * stack, int element) { 
    int * temp; 
    int i; 
    if (Size_S(stack) == stack -> MAXSTACKSIZE) { 
     stack -> MAXSTACKSIZE++; 
     temp = malloc(sizeof(int) * stack -> MAXSTACKSIZE); 
     for (i = 0; i < Size_S(stack); i++) { 
      temp[i] = stack -> stk[i]; 
     } 
     free(stack -> stk); 
     stack -> stk = temp; 
    } 
    int t = stack -> top + 1; 
    stack -> top = t; 
    stack -> stk[t] = element; 
} 

int Top(Stack * stack) { 
    if (isEmpty(stack)) { 
     return -1; 
    } 
    return stack -> stk[stack -> top]; 
} 

int Pop(Stack * stack) { 
    int element; 
    if (isEmpty(stack)){ 
     return -1; 
    } 
    element = Top(stack); 
    stack -> stk[stack -> top] = 0; 
    stack -> top = stack -> top - 1; 
    return element; 
} 

int Size_S(Stack * stack) { 
    return (stack -> top) + 1; 
} 

int isEmpty(Stack * stack) { 
    if (stack -> top == -1) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

void Convert(Stack * stack, char infix[], char postfix[]) { 
    char x, token; 
    int i, j; 
    j = 0; 
    for (i = 0; infix[i] != '\0'; i++) { 
     token = infix[i]; 
     if (isalnum(token)) { 
      postfix[j++] = token; 
     } else if (token == '(') { 
      Push(stack, '('); 
     } else if (token == ')') { 
      while ((x = Pop(stack)) != '(') { 
       postfix[j++] = x; 
      } 
     } else { 
      while (Precedence(token) <= Precedence(Top(stack)) && !isEmpty(stack)) 
      { 
       x = Pop(stack); 
       postfix[j++] = x; 
      } 
      Push(stack, token); 
     } 
    } 
    while (!isEmpty(stack)) 
    { 
     x = Pop(stack); 
     postfix[j++] = x; 
    } 
    postfix[j] = '\0'; 
} 

void PrintStack(Stack * stack) { 
    int length = Size_S(stack); 
    printf("Length: %d\n", length); 
    int i; 
    for (i = 0; i < length; i++) { 
     printf("%d ", stack -> stk[i]); 
    } 
} 

main.c

#include <stdio.h> 
#include <stdlib.h> 
#include "stack.h" 

int main() { 
    Stack * stack = malloc(sizeof(Stack)); 
    int i; 
    InitializeStack(stack, 1); 
    for (i = 0; i < 12; i++) { 
     Push(stack,i); 
     printf("Size of stack: %d, MaxSize: %d\n", Size_S(stack), stack -> MAXSTACKSIZE); 
    } 
    printf("Top element: %d\n", Top(stack)); 
    PrintStack(stack); 
    puts(""); 
    int popped = Pop(stack); 
    printf("Popped: %d\n", popped); 
    PrintStack(stack); 
    puts(""); 
    //postfix test 
    char infix[30], postfix[30]; 
    printf("Enter an infix expression(eg: 5+2*4): "); 
    gets(infix); 
    Convert(stack, infix, postfix); 
    printf("\nPostfix expression: %s", postfix); 
    return 0; 
} 
+0

_and потом я получил их _ Те, кажется, не хватает из вашего вопроса «?». –

ответ

0

Это потому, что у вас есть ненужные кода остатки (скорее всего, ранее использовавшихся для тестирования).

При вводе функции Convert в стеке уже есть некоторые (мусор) записи. Convert делает его работу и населяет postfix с требуемыми данными, но в конце петли while (!isEmpty(stack)) также добавляет ненужные записи, так что шестигранной представление postfix будет выглядеть так:

35 32 34 2A 2B 0A 09 08 07 06 05 04 03 02 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

первые 5 шестигранных символы соответствуют (являются ASCII коды) к 524*+, который является постфиксная форма (если вводить выражения Sion в примере), следующий (11 - в том числе 1-й (0x) 00, который по совпадению является строка NULL терминатор - так он не получает напечатанный на экране printf) являются Значения, помещаемые в стек с помощью нежелательного кода ([0..11] нажата на for петля в главном, затем 11 выставляется - итоговый результат [0..10] - конечно, выставляется в обратном порядке). Это символы тарабарщины, которые printf плюется на экране (пока не встречается 0x00).

Комментарий нежелательный код в main.c так:

#include <stdio.h> 
#include <stdlib.h> 
#include "stack.h" 

int main() { 
    Stack * stack = malloc(sizeof(Stack)); 
    int i; 
    InitializeStack(stack, 1); 
    /* 
    for (i = 0; i < 12; i++) { 
     Push(stack,i); 
     printf("Size of stack: %d, MaxSize: %d\n", Size_S(stack), stack -> MAXSTACKSIZE); 
    } 
    printf("Top element: %d\n", Top(stack)); 
    PrintStack(stack); 
    puts(""); 
    int popped = Pop(stack); 
    printf("Popped: %d\n", popped); 
    PrintStack(stack); 
    puts(""); 
    //*/ 
    //postfix test 
    char infix[30], postfix[30]; 
    printf("Enter an infix expression(eg: 5+2*4): "); 
    gets(infix); 
    Convert(stack, infix, postfix); 
    printf("\nPostfix expression: %s", postfix); 
    return 0; 
} 
+0

Lol, спасибо. Я смотрел на него, как будто я сломал компилятор, когда мне просто нужно было либо очистить стек до преобразования, либо прокомментировать тест стека. – Sora

+0

Добро пожаловать! Кусочек разума: вы никогда не сломаете компилятор (если вы это сделаете (или тот, кто написал этот код), тогда ваш код не будет просто компилироваться) – CristiFati

Смежные вопросы