Инфикс для постфикса с использованием стеков C++: код ошибки 6

Моя задача состоит в том, чтобы реализовать стеки с использованием односвязных списков для преобразования строки в инфиксной форме в постфиксную форму. Для простоты эта строка не содержит пробелов.

Вкратце мой алгоритм таков:

  1. прочитать символ из инфиксной строки

  2. создать временный узел с символом и связанным с ним приоритетом в порядке операций

  3. поместите его в стек, если это операция, а не число/если это число, автоматически добавьте его в строку постфикса

  4. каждый раз, когда символ помещается в стек, если верхний узел стека имеет более высокий приоритет, чем временный узел следующего символа, извлекает его из стека и добавляет к строке постфикса.

Эти шаги работают при преобразовании инфикса в постфикс вручную. Всякий раз, когда я пытаюсь запустить свой код, я продолжаю получать ошибку 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;
        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;
}

person arnavlohe15    schedule 28.10.2017    source источник


Ответы (1)


Почему вы делаете «удалить v» в push? Это удалит узел, который вы только что создали.

person Ian4264    schedule 28.10.2017
comment
да, я понял это через некоторое время. Он избавился от этой ошибки, и теперь я, по крайней мере, получаю строковый вывод - person arnavlohe15; 30.10.2017