Infix to Postfix to Output (Postfix Calculator) using stacks in C++?
-
Good day, everyone! I'm new in C++ and I need help from you experts. 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 e.g., 1 2 + ) before outputting the real answer. 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. 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: "; 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};
-
Answer:
I strongly believe that you have made the code too complex. Neverthless I have corrected and tested till convertion of infix to postfix. You are assigning strings to some value as {NULL} make it as "" or nothing.
Hellohel... at Yahoo! Answers Visit the source
Other answers
I think I agree with Venkate that not only is it too complex, but odd in other ways. For example, this is wrong: char infix_ch[100]={NULL}; char postfix_ch[100]={NULL}; You don't want to initialize the array to null, but to fill the individual content chars to 0. And whats with: int main( ) { char infix_values[100]={NULL}; It appear the main code has been cut off, so we can't really follow it at all.
Motorhead
Related Q & A:
- How to Set Specific Site Collection as SharePoint Search Scope using C#?Best solution by SharePoint
- How to do Network discovery using UDP Broadcast C#?Best solution by Stack Overflow
- Is it possible to develop iPhone application using C#?Best solution by Stack Overflow
- How to update an open Excel in C# using OLEDB?Best solution by stackoverflow.com
- What's the output from this program using fork() and why?Best solution by Stack Overflow
Just Added Q & A:
- How many active mobile subscribers are there in China?Best solution by Quora
- How to find the right vacation?Best solution by bookit.com
- How To Make Your Own Primer?Best solution by thekrazycouponlady.com
- How do you get the domain & range?Best solution by ChaCha
- How do you open pop up blockers?Best solution by Yahoo! Answers
For every problem there is a solution! Proved by Solucija.
-
Got an issue and looking for advice?
-
Ask Solucija to search every corner of the Web for help.
-
Get workable solutions and helpful tips in a moment.
Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.