Мой лектор дал мне задание создать программу для преобразования выражения 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 и поместите стек. Повторите этот шаг как , так как стек не пуст.
- Верните постфиксную строку.
Я предполагаю, что, «создавая точку разрыва», вы имеете в виду «сбой». Точки останова - это отладочная вещь, которая позволяет вам остановить ваш код в заданной точке для отладки. – paxdiablo
Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И тогда, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –