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

Posted

技术标签:

【中文标题】在 C++ 中使用链表进行堆栈【英文标题】:Stack Using Linked List in C++ 【发布时间】:2013-08-28 02:40:53 【问题描述】:

我正在尝试使用 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;

;

【问题讨论】:

我看不到你是如何初始化栈顶的。 "n->next='\0'; 顶部->next=n;"应该是 "n->next= top->next; top->next=n;" 我正在尝试将“top”的数据复制到 n 中,并使“top”指向“n”,如下所示:top(points to n)->n(points to null) 谢谢! JackyZhu 知道了! 【参考方案1】:

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

所以 push 可以读作:

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 &gt;= 1pop() 的开头。

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

void displayStack()

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

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

另外,堆栈应该有一个析构函数 deletes 所有它的 Nodes - 我会让你写一个;)

【讨论】:

问题:在 *next 中放置“nullptr”与放置 '\0' 不同吗?非常感谢@Kaathe 的耐心等待!我知道错误太天真了! '\0' 是字符串结尾字符 - 它是 char 类型。我猜想当您将它分配给指针类型时它必须自动转换为 0,但是编写 nullptr 可以更清楚地说明您要做什么 - 用指向 null 的指针而不是 Node. ~Stack() while(top!=NULL) Node* toDelete=top; top=top-&gt;next; delete toDelete; 【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果你的代码中仍然有这个,如果你的程序正常工作,我会感到惊讶:

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

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

【讨论】:

您能详细说明一下吗?因为程序正在运行!请给我一个不会的条件? 当我使用top-&gt;next=NULLtop=NULL 时,它同时工作。请帮我理解!【参考方案4】:

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

【讨论】:

以上是关于在 C++ 中使用链表进行堆栈的主要内容,如果未能解决你的问题,请参考以下文章

带有链表的c中的堆栈-将元素与头部错误中的元素进行比较

在 C++ 中使用链表按字母顺序对字符串进行排序

如何在 C++ 中使用一个变量对两部分链表进行排序?

SPL 数据结构1-双向链表,堆栈,队列

c语言中(不是C++)具体实现堆栈代码,后进先出原理我懂!

在 Python 中使用链表实现堆栈