在C ++中使用链接列表进行堆栈

时间:2013-08-25 14:32:09

标签: c++ data-structures stack

我正在尝试使用c ++中的链接列表创建堆栈。但我写的显示功能只打印堆栈的顶部。我真的不明白为什么会这样。非常感谢任何帮助或澄清。感谢

#include<iostream.h>
#include<conio.h>

class Node
{
protected:

    Node* next;
    int data;

public:

    Node(int d){data=d;}
    friend class Stack;
};

class Stack
{
public:
    Stack(){top->next='\0';length=0;}

void push(int d)
{
    Node *n=new Node(top->data);
    n->next='\0';
    top->next=n;
    top->data=d;
    length++;
}

int pop()
{
    top=top->next;
    length--;
    return top->data;
}

void displaystack()
{
    while(top->next!='\0')
    {
        cout<<top->data<<endl;
    top=top->next;
    }
}

int getlength()
{
    return length;
}

private:
    Node *top;
    int length;

};

void main()
{
    clrscr();
    Stack s;
    s.push(9);
    s.push(8);
    s.push(7);
    s.push(6);
    s.push(5);
    s.push(3);
    s.displaystack();
    int len=s.getlength();
    cout<<"length of stack is "<<len<<endl;
    getch();
}

它只打印以下内容: 3 堆栈的长度是6

-------- XXXXXXX ------- -------- XXXXXXXX XXXXXXX ----------- --------- XXXXXXXXXXXXX -----

编辑代码后如下所示: 并且也有效! (感谢@Kaathe):P

#include<iostream.h>
#include<conio.h>

class Node
{
protected:
Node* next;
int data;

public:

Node(int d){data=d;}
friend class Stack;
};

class Stack
{
public:
Stack(){top->next=NULL;length=0;}
~Stack()
{
     while(top!=NULL)
 {
   Node* toDelete=top;
   top=top->next;
   delete toDelete;
 }

}

void push(int d)
{
Node *n=new Node(d);
n->next=top;
top=n;
length++;
}

int pop()
{
 Node* oldtop=top;
 top=top->next;
 int oldtopdata=oldtop->data;
 delete(oldtop);
 --length;
 return oldtopdata;
}

void displaystack()
{
Node* current=top;
while(current->next!=NULL)
    {
    cout<<current->data<<endl;
    current=current->next;
    }
}

int getlength()
{
return length;
}

private:
Node *top;
int length;

};

4 个答案:

答案 0 :(得分:2)

当您push时,您想要创建一个全新的Node,请将其数据设置为值d,并将其指向堆栈的旧顶部。然后,您可以将堆栈顶部设置为此新节点。实际上你根本不需要修改旧的顶级节点。

所以推文可以读:

void push(int d)
{
    Node* newTop = new Node(d);
    newTop->next = top;
    top = newTop;
    ++length;
}

我刚刚注意到pop也不会按预期运行,因为你丢弃顶部节点,并返回它下面的节点中的数据。也许你可以写:

int pop() 
{
    Node* oldTop = top;
    top = top->next;
    int oldTopData = oldTop->data;
    delete(oldTop);
    --length;
    return oldTopData;
}

阻止人们弹出空堆栈可能也是个好主意(例如,在length >= 1开头检查pop()

最后,displaystack会通过丢失指向顶部节点的指针来破坏Stack对象。也许这会更好:

void displayStack()
{
    Node* currNode = top;
    while(currNode->next != nullptr)
    {
        std::cout << currNode->data << std::endl;
        currNode = currNode->next;
    }
}

使用nullptr结束链接列表对我来说更有意义。

此外,堆栈应该有一个析构函数delete所有Node s - 我会让你写那个;)

答案 1 :(得分:0)

当您打印(在displaystack中)时,您应该使用临时变量而不是破坏性地更新顶部变量。

为避免pop()中的内存泄漏,您还应delete先前使用new分配的节点。

答案 2 :(得分:0)

如果您的代码中仍然包含此代码,我会感到惊讶:

Stack(){top->next=NULL;length=0;}

解决方案留给读者练习;-)

答案 3 :(得分:0)

您可以将while(top->next!='\0')替换为while(top!='\0') 它应该工作...