简体   繁体   English

使用堆栈中缀到后缀到输出(后缀计算器)

[英]Infix to Postfix to Output (Postfix Calculator) using stacks

Good day, everyone!今天是个好日子! I'm new in C++ (and here in stackoverflow as well) and I need help from you experts.我是 C++ 新手(在 stackoverflow 中也是如此),我需要各位专家的帮助。

I have here a code that should ask the user for the infix expression then converts it to postfix and outputs the result (postfix calculator).我这里有一个代码,它应该向用户询问中缀表达式,然后将其转换为后缀并输出结果(后缀计算器)。 However, I cannot convert postfix to output instantly so as soon as it displays the postfix expression, it asks for the postfix expression again (with spaces after eg, 1 2 + ) before outputting the real answer.但是,我无法立即将后缀转换为输出,因此一旦它显示后缀表达式,它就会在输出真正的答案之前再次要求后缀表达式(例如,1 2 + 之后有空格)。

There is no error or warning but when I run the program, the computer says "file.exe has stopped working" after displaying the postfix expression.没有错误或警告,但是当我运行程序时,计算机在显示后缀表达式后显示“file.exe 已停止工作”。 So the program is able to convert infix to postfix expression correctly but there is still some jinx when displaying the output.所以程序能够正确地将中缀转换为后缀表达式,但在显示输出时仍然存在一些问题。

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

struct node {
    char data;
    node *next;
};

node *top=NULL;
node *bottom=NULL;
node *key;
node *last;
node *before_last;


void push (const char Symbol) {
    key = new node;
    key->data = Symbol;
    key->next = top;
    top = key;
}

void push_for_output (node* &stack, int key) {
    node* newNode = new node;
    newNode->data = key;
    newNode->next = stack;
    stack = newNode;
}

const char pop() {
    if (!top) {
        cout << "Stack underflow\n" << endl;
        return ' ';
    }
    node* key = top;
    top = top->next;
    char ch = key->data;
    delete key;
    return ch;
}

int pop_for_output (node* &stack) {
    int key = stack->data;
    node* nodeToDelete = stack;
    stack = stack->next;
    delete nodeToDelete;
    return key;
}

bool isOperator (char *token) {
    if (strcmp(token, "+") == 0) {
        return true;
    }
    else if (strcmp(token, "-") == 0) {
        return true;
    }
    else if (strcmp(token, "*") == 0) {
        return true;
    }
    else if (strcmp(token, "/") == 0) {
        return true;
    }
    else {
        return false;
    }
}



const bool is_empty() {
    return !top;
}

int postfix(const char *infix) {
    char infix_ch[100]={NULL};
    char postfix_ch[100]={NULL};
    node* stack = NULL;

    strcpy(infix_ch,"(");
    strcat(infix_ch, infix);
    strcat(infix_ch,")");

    char symbol[5]={NULL};
    char temp[5]={NULL};

    for(int i=0; i<strlen(infix_ch); i++) {
        symbol[0]=infix_ch[i];

        if(symbol[0]=='(')
            push(symbol[0]);

        else if(symbol[0]==')') {
            symbol[0]=pop( );
            while(symbol[0]!='(') {
                strcat(postfix_ch, symbol);
                symbol[0]=pop( );
            }
        }

         else if(symbol[0]=='^' || symbol[0]=='*' || symbol[0]=='/' || symbol[0]=='+' || symbol[0]=='-') {
            if(symbol[0]=='*' || symbol[0]=='/') {
                temp[0]=pop( );
                while(temp[0]=='^' || temp[0]=='*' || temp[0]=='/') {
                   strcat(postfix_ch, temp);
                   temp[0]=pop( );
                }
                push(temp[0]);
            }

            else if(symbol[0]=='+' || symbol[0]=='-') {
                temp[0]=pop( );
                while(temp[0]!='(') {
                    strcat(postfix_ch, temp);
                    temp[0]=pop( );
                }
                push(temp[0]);
            }
            push(symbol[0]);
        }

            else
                strcat(postfix_ch, symbol);
    }

       cout << "Postfix: " << postfix_ch;

       char postfix[80];
        cout << "\nEnter postfix expression (include spaces between each operand and/or operator): ";
       cin.getline(postfix, 80);
       char *tokens = strtok(postfix, " ");
       while (tokens != NULL) {
        if (isOperator (tokens)) {
            int operand2 = pop_for_output(stack);
            int operand1 = pop_for_output(stack);
            int result;

            if (strcmp(tokens, "+") == 0) {
                result = operand1 + operand2;
            }
            else if (strcmp(tokens, "-") == 0) {
                result = operand1 - operand2;
            }
            else if (strcmp(tokens, "*") == 0) {
                result = operand1 * operand2;
            }
            else if (strcmp(tokens, "/") == 0) {
                result = operand1 / operand2;
            }

            push_for_output (stack, result);
        }
        else {
            push_for_output (stack, atoi (tokens));
        }
        tokens = strtok(NULL, " ");
    }
    cout << pop_for_output(stack);
    system("pause");
    return 0;
}


 int main( ) {
    char infix_values[100]={NULL};
    cout << "Enter the infix equation: ";
    cin >> infix_values;
    postfix(infix_values);
}

I'm a newbie and I really need help from you experts.我是新手,我真的需要各位专家的帮助。 I will really appreciate it if you help me correct my program.如果您能帮我改正我的程序,我将不胜感激。 Thank you very much and have a nice day!非常感谢你,祝你有美好的一天!

One possible issue is that the pop_for_output() function never checks for an empty/NULL stack like you do in pop() .一个可能的问题是pop_for_output()函数永远不会像在pop()那样检查空/NULL 堆栈。 If an invalid postfix expression is entered, or if your parsing is incorrect, you could very easily get into the case of referencing a NULL pointer which could very well explain the crash.如果输入了无效的后缀表达式,或者您的解析不正确,您很容易陷入引用 NULL 指针的情况,这可以很好地解释崩溃。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM