#c #c 11 #data-structures
#c #c 11 #структуры данных
Вопрос:
#include lt;iostreamgt; #includelt;string.hgt; using namespace std; //Class Node Linked List class Node { public: string data; Node *next; }; //Stack class class stack { public: Node * headref = new Node (); //top = new Node(); //POP ELEMENT FROM STACK string pop () { string top; if (headref == NULL) { cout lt;lt; "Stack is empty"; return "EMPTY"; } else { top = headref-gt;data; headref = headref-gt;next; return top; } return top; } //PUSH ELEMENT IN STACK string push (string element) { if (headref == NULL) { headref-gt;data = element; headref-gt;next = NULL; } else { Node *newnode = new Node (); newnode-gt;data = element; newnode-gt;next = headref; headref = newnode; } return "Hello"; } //RETURNS TOP OF STACK string top() { //Segmentation Fault right here string temp = headref-gt;data; return temp; } //print stack void printStack () { while (headref != NULL) { cout lt;lt; headref-gt;data lt;lt; "n"; headref = headref-gt;next; } } }; //Converts infix to Postfix class convert:public stack { private: int precidence (string operatoor) { if (operatoor == "*" || operatoor == "/") { return 2; } if (operatoor == " " || operatoor == "-") { return 1; } if (operatoor == "^") { return 0; } } public: string algorithmInfix (string infix) { string postfix; for (int i = 0; i lt; infix.length (); i ) { string temp; temp.push_back (infix[i]); if (isalpha (infix[i]) || isdigit (infix[i])) { postfix = postfix infix[i]; } else { if (temp == "(") { cout lt;lt; "( goes in stack"; push (temp); continue; } else if (temp == ")") { cout lt;lt; "Coming out of stack"; while (top () != "(") { postfix = postfix pop (); } pop (); } if (top () == "" || top () == "(" || (precidence (temp) gt;= precidence (top ()))) { push (temp); } else { while (precidence (top ()) gt;= precidence (temp)) { if (top () == "(" || top () == ")") { push (temp); break; } postfix = postfix pop (); } push (temp); } } } string temp = top (); while (true) { if (temp == "") { break; } postfix = postfix pop (); temp = top (); } /*while(top()) postfix = postfix pop(); */ return postfix; } }; //Main int main () { //stack obj; convert obj; string infix; while (true) { cout lt;lt; "Insert your Infix statement. To Exit type exit!!:"; //cin.ignore(); getline (cin, infix); if (infix == "exit" || infix == "EXIT" || infix == "Exit") { break; } //coutlt;lt;"here"; string postfix; postfix = obj.algorithmInfix (infix); //coutlt;lt;"here"; cout lt;lt; infix lt;lt; " " lt;lt; postfix lt;lt; endl; } /*obj.push('5'); obj.push('6'); string top = obj.pop(); coutlt;lt;"Poped this element-gt;"lt;lt;toplt;lt;endl; obj.push('*'); */ obj.printStack (); //coutlt;lt;"Hello"lt;lt;endl; }
Комментарии:
1. Проверьте свою функцию push. Он проверяет наличие нулевого указателя, и если это правда, он все равно разыменовывает его. В более общем плане: это задание, которое требует, чтобы вы реализовали стек связанных списков, или мы можем дать обычное «просто используйте std::вектор»?
2. Связанный список со стеком
3. Разыменование ненулевого указателя также может привести к ошибке segfault, если указатель не указывает на допустимый объект.
4. Да, наконец, исправлено, ссылка headref не возвращалась обратно в начало связанного списка, а указывала на последний узел следующего узла, что делало ее нулевой.