Matsp, I took both of your suggestions and the first one made it respond nearly exactly the same as Swoopy's version. The second part however made it crash worse than originally.
n should be incremented no matter what so that it skips over a space if there is one ( there will be one besides NULL).
But you are right the n++ needs to be moved to after the if else statement. Here is my entire code:
Code:
#include <iostream>
using namespace std;
struct node
{
float num;
char opr;
char type;
node* next;
};
void printList(const node*);
//entry* insert(int n, node* h);
//entry* deleteNode(int n, node* h);
//entry* PQInit(entry* h, entry* PQh);
float arrayToFloat(char part[]);
node* tempArray(node* head, char string[], char part[], int flag, int stringFlag);
int main()
{
node *temp = 0, *head = 0;//starts out empty
node *PQt = 0, *PQh = 0;//Polish queue
//float fltval;
int j, n = 0, flag, count = 0, stringFlag = 0;
char string[80];
cout << "Enter an algebraic equation in reverse polish notation: \n";
cin.getline(string, 80);
cout << "Output from func arrayToFloat:\n";
while(string[n] != '\0')
{
char part[15] = {'\0'};
for(j = 0, flag = 0; (string[n] != ' ') && (string[n] != '\0'); j++, n++)
{
part[j] = string[n];
if(!isdigit(part[j]))//if character
{
flag = 1;
}//if
}//for
//n++;
if(string[n] != '\0')//I dont understand what these if elses are checking for...
{
stringFlag = 1;
//n++;
}//if
else
stringFlag = 0;
n++;
head = tempArray(head, string, part, flag, stringFlag);
}//while
//PQh = PQInit(head, PQh);
cout << "Output from linked list:\n";
printList(head);
//creating PQ stack from initial array
while(head != 0)
{
PQh = new node;
if(head->type == 'N')
{
PQh->num = head->num;
PQh->type = 'N';
PQh->next = PQt;
PQt = PQh;
}//if
else
{
PQh->opr = head->opr;
PQh->type = 'O';
PQh->next = PQt;
PQt = PQh;
}//else
head = head->next;
}//while
cout << "Output from PQ: \n";
printList(PQh);
return 0;
}//main
/***************************************/
//Prints list of Nodes
void printList(const node* pointer)
{
while(pointer != 0)
{
if(pointer->type == 'N')
cout << pointer->num << " ";
else
cout << pointer->opr << " ";
pointer = pointer->next;
}//while
cout << endl;
}//printList
/****************************************/
//Converts an array of ints to a float value
float arrayToFloat(char part[])
{
int L = 0, i, j;
float val = 0, value[15] = {0};
float valtab[5] = {1, 10, 100, 1000, 10000};
// 1 2 3 4 5
for(i = 0; part[i]; i++)
{
value[i] = part[i] - '0';//converting to int from char
}//for
L = strlen(part);
for(i = 0, j = L - 1; i < L; i++, j--)
{
val = val + (value[i] * valtab[j]);
}//for
return val;
}//arrayToFloat
/******************************************/
//Initializes PQ
node* tempArray(node* head, char string[], char part[], int flag, int stringFlag)
{
float fltval;
node *temp = new node;
if(flag == 0) //if part consists of int
{
if(stringFlag == 1)
{
fltval = arrayToFloat(part);//converting array based number to float
cout << fltval << endl;
temp->num = fltval;
temp->type = 'N';
temp->next = head;
}
}
else
{
if(stringFlag == 0)
{
temp->opr = part[0];
temp->type = 'O';
temp->next = head;
}
}
return temp;
}//tempArray
Also another thing, while making modifications, I noticed the if else statement:
Code:
if(string[n] != '\0')//I dont understand what these if elses are checking for...
{
stringFlag = 1;
//n++;
}//if
else
stringFlag = 0;
And it is not making any sense to me whatsoever(yeah I know its sad, I wrote it, need better comments), supposedly it is supposed to detect if it is a number or an operator. If anyone can save me from my stupidity, that would be great.