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

后缀符号C的内缀[重复]

胡元明
2023-03-14

你好,Stack,我现在正想写一个RPN转换器,我是C新手。但是我遇到了问题。希望我能详细解释这些问题。我使用数组来堆叠运算符。当我开始讨论以下问题时,让我们使用示例“5 8”:

else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){
                while(isp(stack1.top()) >= icp(infix[i])){
                    postfix += stack1.pop();
                }
                if(isp(stack1.top()) < icp(infix[i])){
                    stack1.push(infix[i]);      
                }

出于某种原因,它会将运算符推到堆栈上,但不会将运算符添加到后缀字符串变量中,因为我也在添加我的元素。我看了一下我的pop函数,这似乎是正确的,但我很困惑。如果你能把我引向正确的方向那就太好了。

这是我的完整代码:

#include <iostream>
#include <string>
#define DEFAULT_SIZE 100

using namespace std;

class Stack{

private:
    char *array;
    int tos, capacity;

public:
    //constructors
    Stack();

    //Destructor
    ~Stack();

    //Methods
    void push(char a);
    char pop();
    char top();
    int get_size();
    bool is_empty();
    bool is_full();
    void display();    

};

Stack::Stack(){
    array = new char[DEFAULT_SIZE];
    tos = 0;
    capacity = DEFAULT_SIZE;
}

Stack::~Stack(){
    delete[] array;
}

void Stack::push(char a){
    if(!is_full())
        array[tos++] = a;
}

char Stack::pop(){
        return array[--tos];
}

char Stack::top(){
    return array[tos];
}

int Stack::get_size(){
    return tos; 
}

bool Stack::is_empty(){
    if(tos == 0)
        return true;
    else
        return false;
}

bool Stack::is_full(){
    if(tos == capacity)
        return true;
    else
        return false;
}

void Stack::display(){
    if (tos == 0)
        cout<<"The stack is empty"<<endl;
    else{
        for (int i=0; i<tos;i++)
                cout<<array[i]<<" ";
        cout<<endl;        
    }
}

int isp(char a){
    if(a == '^'){
        return 3;
    }
    else if (a == '*' or a == '/'){
        return 2;
    }
    else if(a == '+' or a == '-'){
        return 1;
    }
    else if(a == '('){
        return 0;
    }
    else
        return -1;
}

int icp(char a){
    if(a == '^'){
        return 4;
    }
    else if (a == '*' or a == '/'){
        return 2;
    }
    else if(a == '+' or a == '-'){
        return 1;
    }
    else if(a == '('){
        return 4;
    }
}



int main(){
    string infix, postfix;
    Stack stack1;

    cout << "This is a Infix to Postfix Expression converter." << endl;
    cout << "Enter your Infix Expression: ";
    cin >> infix;
    stack1.push('#');

    for(int i=0;i<infix.length();i++){
        if(isdigit(infix[i]) or isalpha(infix[i])){
            postfix += infix[i];
        }
        else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){
            while(isp(stack1.top()) >= icp(infix[i])){
                postfix += stack1.pop();
            }
            if(isp(stack1.top()) < icp(infix[i])){
                stack1.push(infix[i]);      
            }
        }
    }
    cout << postfix;


    return 0;
}

另外,如果你知道C RPN转换器上的任何好的资源网站,请随时分享,因为这将是一个非常大的帮助!我在谷歌上找到了一个随机的算法。

共有1个答案

严宇
2023-03-14

在您的示例中,您只是在堆栈上按下“”符号,但您从未弹出它,因为在处理符号“8”后,您将留给了循环。我认为您需要另一个while循环来清空最后的堆栈。

for(int i=0;i<infix.length();i++){
    if(isdigit(infix[i]) or isalpha(infix[i])){
        postfix += infix[i];
    }
    else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){
        while(isp(stack1.top()) >= icp(infix[i])){
            postfix += stack1.pop();
        }
        if(isp(stack1.top()) < icp(infix[i])){
            stack1.push(infix[i]);      
        }
    }
}

// Fetch the remaining operators from the stack
while(!stack1.is_empty()){
    postfix += stack1.pop();
}

cout << postfix;

当心bug,因为我自己无法测试这段代码。

 类似资料:
  • 问题内容: 我正在寻找后缀符号表示法的算法,该算法将产生最小数量的括号。 我发现它会产生很多括号:http : //tajendrasengar.blogspot.com/2011/09/postfix-to- infix-algorithm.html 例如 输入: 结果: 问题答案: 如果您确实希望尽可能地减少括号,则需要执行的操作与链接的算法类似。然而… 您应该为中的每个 复合 操作数存储一个

  • 我应该将以下内容转换为后缀形式: 我得到了这个答案: 这是正确的吗?如果我使用了错误的后缀形式,那么之后还有很多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。

  • 如何正确地为任何类型生成前缀和后缀运算符? 例如,我有一个枚举类: 我尝试创建操作符重载,如: 但这不起作用。 错误:“operator”不匹配 一般来说,如何重载运算符? 我想看看任何类型的通用指南。

  • 问题内容: 我的朋友给我开了个玩笑: 问:C和C ++有什么区别? A.没什么,因为:(C-C ++ == 0) 我试图更改订单并被卡住。 看下面的代码: 为什么返回: 我了解后缀和前缀增量。为什么这不是结果? 问题答案: 因为在第一个示例中,从10开始 递增,然后返回10,所以第二个示例由于已递增而现在求值为11。因此,求出的最终表达式为,等于-1。 在第二个示例中,再次增加,但返回12,因为它

  • 为数字添加序号后缀。 使用模运算符(%)来查找各位和十位的值。查找哪些序号模式数字匹配。如果数字在十位模式中找到,请使用十位的序数。 const toOrdinalSuffix = num => { const int = parseInt(num), digits = [int % 10, int % 100], ordinals = ['st', 'nd', 'rd', '

  • 问题内容: 从下面或此处的程序中,为什么最后一次调用要打印该值7? 问题答案: 这将打印出“ 6”,因为它将i加1并返回值。5 + 1 = 6;这是前缀,在操作中使用该编号之前会添加该编号。 这将打印出“ 6”,因为它需要i,存储副本,加1并返回副本。因此,你获得了我当时的价值,但同时又增加了它。因此,你可以打印出旧值,但是它会增加。后缀增量的好处。 然后,当你打印出i时,它会显示i的实际值,因为