当前位置: 首页 > 知识库问答 >
问题:

使用堆栈C的中缀到后缀:错误代码6

桑宇
2023-03-14

我的任务是使用单链表实现堆栈,将中缀形式的字符串转换为后缀形式。为简单起见,此字符串不包含任何空格。

简而言之,我的算法是:

>

按操作顺序使用字符及其关联优先级创建临时节点

如果是操作而不是数字,则将其推到堆栈上/如果是数字,则自动将其附加到后缀字符串

每次将一个字符推送到堆栈上时,如果堆栈的顶部节点的优先级高于下一个字符的临时节点,请将其从堆栈中弹出,并将其附加到后缀字符串中。

这些步骤在手动执行中缀到后缀时有效。每当我试图运行我的代码,我总是得到一个错误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;
}

共有1个答案

东方嘉木
2023-03-14

为什么在推送中要“删除v”?这将删除刚刚创建的节点。

 类似资料:
  • 我的讲师给了我一个任务,创建一个程序,使用堆栈将中缀表达式转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个名为inToPos(charstring[])的函数正在创建断点,该函数负责使用堆栈将字符串中缀中的中缀表达式转换为字符串后缀中的后缀表达式。你们能帮帮我,告诉我我做错了什么吗? 这些是我的代码,非常需要您的帮助:) 注:inToPos功能是使用以下算法实现的: 从左到右扫描中

  • 我正在为我的一堂计算机科学课开发一个计算后缀表达式结果的程序。该程序使用堆栈ADT来实现这一点。 我已经编写了程序,但相信可能会有错误,因为一些表达式的结果不正确。我不确定我的错误在哪里。 此外,当输入文件为空时,程序将生成一个值32767。那是从哪里来的? 表达式:34+3*值=21。 主程序:

  • 我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi

  • 日安!我正在使用堆栈实现一个内缀到后缀转换器。当用户输入一个没有括号的内插表达式时,它可以工作;但是当存在括号时,控制台说: 我的问题是在实现排名(堆栈的顶部)。

  • 我正在尝试取一个不固定表达式的字符串,并将其更改为后缀。 我相信大部分代码应该可以工作,但是当queue::enqueue(char,int)被调用时会出现“无法读取内存”的问题,程序无法读取“front”或“freal”。如果我在test_driver.cpp中更改iString,我会得到相同的错误,但是在stack::empty()上。我认为这是一个与类之间的联想有关的问题。 在最后的努力中,

  • 我得到了一段代码来破译、解释和提供任何改进建议。我被告知它可以工作,我们不能运行代码来测试它。我很理解它,但只需要有人来运行它,以确保我所理解的是正确的,请获得任何帮助来解释我不理解的地方。我已经做了大量的研究,仍然有一些问题。 代码正在实现用于读取只使用乘法和加法的后缀表达式。然后计算表达式,同时将结果保存到堆栈中。然后打印出结果。操作数被推到堆栈上,然后当它读取运算符时,它从堆栈中弹出前2个操