2013-03-11 2 views
2

Мой лектор дал мне задание создать программу для преобразования выражения infix в постфикс с помощью Stack. Я сделал классы стека и некоторые функции для чтения выражения infix.Infix to Postfix using stack

Но эта одна функция, называемая inToPos (char string []), которая отвечает за преобразование выражения inFix в строку inFix в выражение post fix в строке postFix с использованием стеков, создает точку останова. Можете ли вы, ребята, помочь мне и рассказать мне, что я делаю неправильно?

Это мои коды, которые остро нуждается в вашей помощи .. :)

#include<stdio.h> 
#include<stdlib.h> 
#define MAX 15 
#define true 1 
#define false 0 

typedef struct node* nodeptr; 

typedef struct node{ 
    int data; 
    nodeptr next; 
}Node; 

typedef struct{ 
    int count; 
    nodeptr top; 
}Stack; 
typedef Stack* StackList; 

StackList create(); 
void display(StackList list); 
int isEmpty(StackList list); 
void push(StackList list, int item); 
void pop(StackList list); 

int inToPos(char string[]); 
int isOperator(char string[], int i); 
int precedence(char x); 

StackList create(){ 
StackList list; 
list=(StackList)malloc(sizeof(Stack)); 
list->count=0; 
list->top=NULL; 
return list; 
} 

void display(StackList list){ 
    nodeptr ptr; 
    ptr=list->top; 
    while(ptr!=NULL){ 
     printf("%d ",ptr->data); 
     ptr=ptr->next; 
    } 
    printf("\n"); 
} 

int isEmpty(StackList list){ 
    return list->count==0; 
    //return list->top==NULL; 
} 

void push(StackList list, int item){ 
    nodeptr temp; 
    temp=(nodeptr)malloc(sizeof(Node)); 
    temp->data=item; 
    temp->next=list->top; 
    list->top=temp; 
    (list->count)++; 
} 

void pop(StackList list){ 
    nodeptr temp; 
    temp=list->top; 
    list->top=temp->next; 
    temp->next=NULL; 
    free(temp); 
    (list->count)--; 
} 

int inToPos(char string[]){ 
    int i,a=0; 
    char postfix[MAX]; 
    StackList list=create(); 
    for(i=0;string[i]!='\0';i++){ 
     if(!isOperator(string,i)){ 
      postfix[a]=string[i]; 
      a++; 
     } 
     else if(isEmpty(list)) 
      push(list,string[i]); 
     else{ 
      if(precedence(string[i])>precedence(list->top->data)) 
       push(list,string[i]); 
      else{ 
       postfix[a]=list->top->data; 
       a++; 
       pop(list); 
       if(!isEmpty(list)){ 
        while(precedence(list->top->data)<=precedence(string[i])){ 
         postfix[a]=list->top->data; 
         a++; 
         pop(list); 
        } 
       } 
       else 
        push(list,string[i]); 
      } 
     } 
    } 
    puts(postfix); 
} 


int isOperator(char string[], int i){ 
    switch(string[i]) 
    { 
    case '+': 
    case '-': 
    case '*': 
    case '%': 
    case '/': return true; 

    default: return false; 
    } 
} 

int precedence(char x){ 
    switch(x) 
    { 
    case '%': 
    case '*': 
    case '/': return 2; 
    case '+': 
    case '-': return 1; 

    default: return 0; 
    } 
} 
int main(void){ 

    char string[MAX]="a+b*c-d"; 
    inToPos(string); 
} 

Примечание функции inToPos была сделана с использованием этого алгоритма:

  • Сканированием строки Инфиксной слева направо.
  • Инициализировать пустой стек.
  • Если отсканированный символ является операндом, добавьте его в строку Postfix. Если отсканированный символ является оператором, и если стек пуст Нажимаем символ в стек.
  • Если отсканированный символ является оператором и стек не пуст, сравнивает приоритет символа с элементом поверх стека (topStack). Если topStack имеет более высокий приоритет над отсканированным символом . Положите стек еще. Нажмите сканированный символ в стек . Повторите этот шаг, пока стек не пуст, а topStack имеет приоритет над символом. Повторите этот шаг до тех пор, пока не будут проверены символы .
  • (После того, как все символы отсканированы, мы должны добавить любой символ, который может иметь столбец ). Если стек не пуст, добавьте topStack to Postfix string и поместите стек. Повторите этот шаг как , так как стек не пуст.
  • Верните постфиксную строку.
+0

Я предполагаю, что, «создавая точку разрыва», вы имеете в виду «сбой». Точки останова - это отладочная вещь, которая позволяет вам остановить ваш код в заданной точке для отладки. – paxdiablo

+2

Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И тогда, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –

ответ

2

Вы действительно должны научиться использовать отладчик, это отличный инструмент для решения таких проблем. Тем не менее, я побежал и понял вашу проблему:

На этой линии:

while(precedence(list->top->data)<=precedence(string[i])){ 

Когда вы перебор списка, вам нужно проверить, является ли стек пустой каждый раз, а не только перед вы идете в петлю. Итак, сделайте примерно следующее:

while(!isEmpty(list) && precedence(list->top->data)<=precedence(string[i])){ 

вместо этого.

+0

Спасибо, это действительно помогло мне. Кстати, я использую отладчик, но я не понимаю все, что он говорит. Особенно, когда отладчик дает мне контрольные точки.Uhm, "postfix [a] = string [i];" правильно добавить элемент в постфикс? Когда я скомпилировал его, есть мусор после предполагаемых символов .. thakns again :) –

+0

мусор я имею в виду .. –

+0

@CirPatrickHonor Вы забыли добавить '\ 0' байт в конец строки. Я думаю, что вы хотите сделать postfix [a] = '\ 0''. – Xymostech

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