C++ 中堆栈的链表实现

Linked list implementation of stack in C++

本文关键字:链表 实现 堆栈 C++      更新时间:2023-10-16

我正在尝试在堆栈中使用简单的推送,弹出和显示函数作为链表实现。 我认为推送功能工作正常,但我在显示和弹出时遇到了问题。 每当我使用 Pop 功能时,我只得到一个结果,下次它说,">堆叠空!! 我认为我犯了一个逻辑错误。 请帮我。 我正在使用 Turbo C++ 4.5。 我正在发布下面的代码。 提前感谢!

#include<iostream.h>
#include<conio.h>
#include<process.h>
struct node
{
    int data;
    node *link;
};
node *temp, *top;
void PUSH()
{
    temp=new node;
    cout<<"nEnter data item:";
    cin>>temp->data;
    temp->link=NULL;
    if(top==NULL)
    {
        temp->link=top;
        top=temp;
    }
}
void POP()
{
    if(top==NULL)
    {
        cout<<"nEmpty";
        return;
    }
    temp=top;
    top=top->link;
    cout<<"nDeleted value is : "<<temp->data;
    temp->link=NULL;
    delete(temp);
}
void SHOW()
{
    if(top==NULL)
    {
        cout<<"nEmpty!!";
        return;
    }
    while(temp!=NULL)
    {
        cout<<temp->data<<endl;
        temp=temp->link;
    }
}
void main()
{   int ch;
    do{
    cout<<"nEnter your choice";
    cout<<"n1.Pushn2.Popn3.Shown4.Exit";
    cin>>ch;
    switch(ch)
    {
        case 1: PUSH();
        break;
        case 2: POP();
        break;
        case 3: SHOW();
        break;
        case 4: exit(0);
        break;
    }
    }while(ch!=4);
    getch();
}

第二次推送后,您不会将temp节点链接到现有的"堆栈"。

if(top==NULL)
{
    temp->link=top;
    top=temp;
}

如果,为什么需要这个?我想您每次都必须在 Push 方法中更新top节点。

首先,你需要清除你关于通过链表实现堆栈的概念.....

您的 PUSH 函数应如下所示

void PUSH()
{
    temp=new node;
    cout<<"nEnter data item:";
    cin>>temp->data;
    temp->link=NULL;
    if(top==NULL)
        top=temp;      
    else
    {
        temp->link=top;    
        top=temp;
    }
}

POP 函数被声明为 void,因此它不得返回任何值...正确的声明应该是

void POP()
{
    if(top==NULL)
    {
        cout<<"nEmpty";
    }
    else
    {
        cout<<"nDeleted value is : "<<top->data;
        temp=top;
        top=top->link;
        delete(temp);
    }
}

而在 SHOW 函数中,其他部分应该是

        temp=top;
        while(temp!=NULL)
        {
            cout<<temp->data<<endl;
            temp=temp->link;
        }

我建议你应该使用代码块,因为它的用户界面比 Turbo C++ 更干净、更简单。

您可以通过这篇文章清除您的概念 在C++中使用链表进行堆栈

在你的PUSH函数中,你只在NULL top的情况下才对新node做任何事情,所以所有推送到非空堆栈都会被忽略(除了它们泄漏内存(。 试试这样。

void PUSH() {
    temp = new node;
    cout << "nEnter data item:";
    cin >> temp->data;
    temp->link = top;
    top        = temp;
}