Моя программа должна конвертировать подсказку из инфикса в постфикс. До сих пор, с помощью отладчика и других методов, я нашел точную точку, в которой я segfault, но не понимаю, почему.
Вот мой код:
Вот itop.h:
using namespace std;
#include <cstdlib>
#include <iostream>
class sNode{
public:
char data;
sNode *next;
};
class stack{
public:
sNode *head;
void push (char);
sNode pop();
int rank(char);
stack()
{
cout << "Initiliazing stack." << endl;
}
};
Это мой файл itop.cpp:
#include "itop.h"
void stack::push (char a)
{
// cout << "Pushing " << a << endl;
sNode *sn;
sn = new sNode;
sn->data = a;
sn->next = head;
head = sn;
}
sNode stack::pop()
{
// cout << "Popping stack." << endl;
sNode *sn;
sn = head;
head = head->next;
return *sn;
}
int stack::rank(char x)
{
int num = 0;
// cout << "Checking rank." << endl;
if(x == '\0')
{
num = 1;
// cout << "Checking for null" << endl;
return num;
}
else if(x == '+' || x == '-')
{
num = 2;
// cout << "Checking if + or -" << endl;
return num;
// cout << "After return." << endl;
}
else if(x == '*' || x == '/')
{
num = 3;
// cout << "Checking for * or /" << endl;
return num;
}
else
cout << "Error! Input not valid!" << endl;
}
И вот main.cpp:
using namespace std;
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "itop.h"
int main()
{
char *temp1; //Instantiating variables.
char *temp2;
temp1 = new char[20];
temp2 = new char [20];
stack s;
do //Checking commands.
{
cout << "infix_to_postfix> ";
cin >> temp1;
if(strcmp(temp1, "quit") == 0)
{
return 0;
}
if(strcmp(temp1, "convert") != 0)
{
cout << "Error! Invalid command." << endl;
}
cin >> temp2;
if(strcmp(temp1, "convert") == 0)
{
for(int i=0; i<sizeof(temp2); i++)
{
if(isdigit(temp2[i]))
{
cout << atoi(&temp2[i]);
}
else if(s.rank(temp2[i]) < s.rank(s.head->data))
{
sNode temp = s.pop();
cout << temp.data;
}
else
{
s.push(temp2[i]);
}
}
}
else
{
cout << "Error! Command not supported." << endl;
}
}while(strcmp(temp1, "quit") != 0);
return 0;
}
Функция вызывается в
else if(s.rank(temp2[i]) < s.rank(s.head->data))
И проблема здесь:
else if(x == '+' || x == '-')
{
num = 2;
// cout << "Checking if + or -" << endl;
return num;
// cout << "After return." << endl;
}
В частности, перед возвратом num я получаю сообщение об ошибке «Ошибка сегментации (дамп памяти)». Я использовал GDB, и все, что я знаю, это то, что сразу после «Проверка, + или -» я вижу «$ 1 = 2». Я не совсем уверен, что это значит, но это то, что я хочу вернуть.
Спасибо за помощь.
Исправление 1: написать правильный конструктор.
stack()
{
head=NULL;
cout << "Initiliazing stack." << endl;
}
Исправление 2: напишите дополнительный метод, чтобы проверить, пуст ли стек.
int stack::empty()
{
if(head == NULL)
return true;
else
return false;
}
Исправление 3: проверьте, пустой ли стек перед использованием данных стека.
else if(!s.empty() && s.rank(temp2[i]) < s.rank(s.head->data))
{
...
}
Исправить 4: исправить остальную часть кода логики.
В вашем коде много ошибок. Ваша реализация стека неверна. push()
например только наборы head
снова и снова. Это приводит к тому, что ваш класс стека может содержать только один элемент. next
никогда не устанавливается ни на что, поэтому он содержит случайный мусор. Далее у вас есть это:
for(int i=0; i<sizeof(temp2); i++)
sizeof(temp2)
не дает вам количество символов строки temp2
указывает на. Это дает вам размер указателя temp2
сам. Кроме того, вы заканчиваете тем, что читаете s.head
из пустого стека, который будет указателем на случайный мусор. В этот момент все ставки, конечно, не принимаются. Вы не можете ожидать ничего, кроме аварии и ожога.