# Postfix Calculator Using Stack, Linked Lists

• 12-04-2008
Velocity
Postfix Calculator Using Stack, Linked Lists
Hello,

I've got a program I'm doing that does +, -, *, and / operations on positive integers in a postfix notation. The code I have at the moment compiles, but upon running the code, it stalls once I enter the expression. When I hit Enter, it should recognize the '\n' character and break the loop but it does not. Any help on fixing this error (and any others)?

Code:

```#include <iostream> #include <iomanip> using namespace std; class node {   public:     float number;     node *next; }; node* push(node *stack, float data) {   node *utility;   utility = new node;   utility -> number = data;   utility -> next = stack;   return utility; } node* pop(node *stack, float &data) {   node *temp;   if (stack != NULL)   {     temp = stack;     data = stack -> number;     stack = stack -> next;     delete temp;   }   else cout << "\nERROR: Empty stack.\n";   return stack; } int main() {   float answer, operand1, operand2;   char ch;   node *utility, *top;   utility = new node;   utility -> number = 0;   utility -> next = NULL;   top = new node;   top -> number = 0;   top -> next = utility;   cout << "Postfix Calculator\n\n"       << "Enter a legal positive integer postfix operation.\n\n";   cin >> ch;   while(ch != '\n')     {         cin >> ch;         int operand = 0;         while(ch == ' ')           cin >> ch;         if((ch >= '0')&&(ch <= '9')){           while(ch != ' '){             operand = operand*10 + (ch-48);             cin >> ch;}           top = push(top, operand);}         else{           pop(top, operand1);           pop(top, operand2);           switch(ch){             case '+': answer = operand2 + operand1;             case '-': answer = operand2 - operand1;             case '*': answer = operand2 * operand1;             case '/': answer = operand2 / operand1;}           push(top, answer);}     }   pop(top, answer);   cout << "\nAnswer: " << answer << endl; }```
• 12-04-2008
tabstop
The cin >> ch at the very top of the loop means you don't process the first number read in.

I also don't see why you need to seed the stack with two "blank" values.

Edit: And don't forget some breaks after your switch cases.

Edit edit: And the magic phrase is "cin >> noskipws".
• 12-04-2008
Velocity
I always forget those breaks... :D
• 12-04-2008
Velocity
However even with making those fixes it still doesn't advance once I hit Enter/Return...
• 12-04-2008
tabstop
You should only need to do noskipws once, somewhere -- I put it before any other reads in your code.
• 12-05-2008
Velocity
Code:

```#include <iostream> #include <iomanip> using namespace std; class node {   public:     float number;     node *next; }; node* push(node *stack, float data) {   node *utility;   utility = new node;   utility -> number = data;   utility -> next = stack;   return utility; } node* pop(node *stack, float &data) {   node *temp;   if (stack != NULL)   {     temp = stack;     data = stack -> number;     stack = stack -> next;     delete temp;   }   else cout << "\nERROR: Empty stack.\n";   return stack; } int main() {   float answer, operand1, operand2;   char ch = ' ';                                    //just so that the while loop runs   node *utility, *top;   utility = new node;   utility -> number = 0;   utility -> next = NULL;   top = new node;   top -> number = 0;   top -> next = utility;   cout << "Postfix Calculator\n\n"       << "Enter a legal positive integer postfix operation.\n\n";  while(ch != '\n')     {         cin >> noskipws >> ch;         int operand = 0;         while(ch == ' ')           cin >> ch;         if((ch >= '0')&&(ch <= '9')){           while(ch != ' '){             operand = operand*10 + (ch-48);             cin >> ch;}           top = push(top, operand);}         else{           pop(top, operand1);           pop(top, operand2);           switch(ch){             case '+': answer = operand2 + operand1;             case '-': answer = operand2 - operand1;             case '*': answer = operand2 * operand1;             case '/': answer = operand2 / operand1;}           push(top, answer);}     }   pop(top, answer);   cout << "\nAnswer: " << answer << endl; }```
This is where I am now and the problem still hasn't righted itself... it doesn't recognize the new-line character at all.

EDIT: Never mind, the program gives me an answer... except it's not the right one. 2 3 45 + + gives me 90 instead of 50. Hmm...
• 12-05-2008
tabstop
You do realize pop is unable to change the value of its first parameter? Just like you have top = push, you should to top = pop.
• 12-05-2008
Velocity
I don't get what you mean. Are you meaning to put:

top = pop(top, operand1);
top = pop(top, operand2);

in the "else" part of the main function?
• 12-05-2008
tabstop
Yes. Otherwise top will still be pointing at 45, forever and ever.
• 12-05-2008
Velocity
I tried that as soon as I posted last, and it gave me:

ERROR: Empty stack.

ERROR: Empty stack.