2017-12-06 7 views
1

私はどこでもこのエラーを見つけようとしています。私は、テキストを読み込み、リンクされたリストスタックに括弧をプッシュし、一致する括弧が読み込まれたときにそれらをポップするプログラムを書いています。しかし、pop関数のときにクラッシュします。スタックポップ機能のヘッドポインタがプログラムにクラッシュする

問題は、pop()またはpush()関数のいずれかにあります。

void IntStack::push(int data){ 
    assert(!isFull()); 
     Node *temp = new Node; 
     temp->data = data; 
     temp->next = NULL; 
} 

int IntStack::pop(){ 
    int result = -1; 
    if(isEmpty()){ 
     result = head->data; //Crashes on this line 
     Node *temp; 
     temp = head->next; 
     delete head; 
     head = temp; 
    } 

    return result; 
} 

次はドライバです。

#include <iostream> 
#include <fstream> 
#include <string> 
#include "IntStack.h" 

using namespace std; 

bool ArePair(int first,char last){ 
    if(first == '(' && last == ')') return true; 
    else if(first == '{' && last == '}') return true; 
    else if(first == '[' && last==']') return true; 
    return false; 
} 

int main(){ 
    string fileName; 

    cout << "Hello, please enter a filename: "; 
    cin >> fileName; 

    ifstream inFile; 

    inFile.open(fileName.c_str()); 

    while (!inFile){ 
     cerr << "ERROR: Cannot open " << fileName << ". Please re-enter.\n"; 
     cin >> fileName; 
     inFile.open(fileName.c_str()); 
    } 

    string current; 
    IntStack iStack; 
    int par; //parenthesis 

    while(inFile){ 
     inFile >> current; 

     for(int i=0;i<current.length();i++){ 
      if(current[i] == '('||current[i] == '{'||current[i] == '['){ 
       par = current[i]; 
       iStack.push(par); 
       } 
      else if(current[i] == ')'||current[i] == '}'||current[i] == ']'){ 
       if(!iStack.isEmpty() || !ArePair(par,current[i])){ 
        cout << "debug\n"; 
       } 
       else{ 
        iStack.pop(); 
       } 
      } 
     } 
    } 



    inFile.close(); 

} 

助けてください。私はそれが無効なポインタかもしれないと思う。私はこれがスタックを利用する最も効率的な方法ではないことを理解していますが、私は単一リンクリストを使用する必要があるクラスに対してです。コードの最後は不完全なので、私は私のポップ関数を渡さなかった。

EDIT:残りのコードは次のとおりです。

bool IntStack::isFull(){ 
    return false; 

} 
bool IntStack::isEmpty(){ 
    if(head == NULL){ 
     return true; 
    } 
    else 
     return false; 
} 

答えて

0

さらにコード貼り付け、isEmptyの機能は何ですか?その名前は、スタックが空であることを返します。スタックにはいくつかの要素がある場合はfalseです。この場合、あなたはポップ・機能でこの1

if(!isEmpty()){ 

を使用して

if(isEmpty()){ 

この行を変更する必要があります。

+0

私は残りのコードを質問に追加しました。私はそれがクラッシュする理由を解決していないので、isFalseはただ真を返します。 – user8891853

+0

'isEmpty'がtrueを返すとき、' head'はヌルです。頭の空ポインタを使ってデータを読み込みますか?これはあなたのアプリがクラッシュする理由です。 – rafix07

関連する問題