Моя задача состоит в том, чтобы реализовать стеки с использованием односвязных списков для преобразования строки в инфиксной форме в постфиксную форму. Для простоты эта строка не содержит пробелов.
Вкратце мой алгоритм таков:
прочитать символ из инфиксной строки
создать временный узел с символом и связанным с ним приоритетом в порядке операций
поместите его в стек, если это операция, а не число/если это число, автоматически добавьте его в строку постфикса
каждый раз, когда символ помещается в стек, если верхний узел стека имеет более высокий приоритет, чем временный узел следующего символа, извлекает его из стека и добавляет к строке постфикса.
Эти шаги работают при преобразовании инфикса в постфикс вручную. Всякий раз, когда я пытаюсь запустить свой код, я продолжаю получать ошибку 6 SIGABRT. Мой код должен быть простым для понимания. Может ли кто-нибудь сказать мне, что означает эта ошибка, почему я ее получаю и как ее исправить, чтобы мой код правильно выводил строку постфикса?
#include <iostream>
#include <string>
using namespace std;
string postfix; //infix and postfix strings
//function to return true if a character is an operation
bool isoperator(char a)
{
if(a == '(' || ')' || '*' || '/' || '+' || '-') //might need to
change to "" instead of ''
{
return(true);
}
else
{
return(false);
}
}
//node class
class node
{
public:
char character;
//double number;
int level; //to check for precedence of operations
node *ptr;
void assignlevel()
{
switch(character)
{
case ')':
level = 3;
break;
case '(':
level = 0;
break;
case '+':
level = 1;
break;
case '-':
level = 1;
break;
case '*':
level = 2;
break;
case '/':
level = 2;
break;
default:
level = 0;
}
}
friend class stack;
};
//stack class
class stack
{
public:
node *top, *temp;
//Constructor Function
stack()
{
top = new node;
top->character = '&';
top->ptr = NULL;
top->level = 0;
temp = new node;
temp->ptr = NULL;
}
//Empty
bool empty()
{
return(top->character == '&');
}
//Read character from string
void readchar(char a)
{
temp->character = a;
temp->assignlevel();
}
//Check Precedence of top and temp
bool precedence()
{
return(top->level >= temp->level);
}
//Push function for infix to postfix
void push1(char a)
{
readchar(a);
if(isoperator(temp->character)) //Push onto stack if character is an operation
{
if(empty())
{
top->character = temp->character;
top->assignlevel();
}
else
{
node *v = new node;
v->character = temp->character;
v->level = temp->level;
v->ptr = top;
top = v;
delete v;
}
}
else //append to string if character is number
{
postfix += temp->character;
}
if(precedence()) //we check if we have to pop every time we push
onto the stack
{
pop1();
}
}
void pop1() //Pop onto postfix string
{
postfix += top->character;
node *w = top->ptr;
delete ⊤
top = w;
delete w;
}
};
int main()
{
string infix = "2+3-5*(7+1)";
stack op;
for(int i = 0; i < infix.size(); ++i)
{
op.push1(infix[i]);
}
for(int j = 0; j < infix.size(); j++)
{
cout << postfix[j];
}
return 0;
}