簡體   English   中英

C++中棧的鏈表實現

[英]Linked list implementation of stack in C++

我正在嘗試在堆棧中使用簡單的 Push、Pop 和 Show 函數作為鏈表實現。 我認為 Push 功能工作正常,但我在 Show 和 Pop 上遇到了問題。 每當我使用 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.Push\n2.Pop\n3.Show\n4.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函數中,如果topNULL ,您實際上只對新node執行任何操作,因此所有推入非空堆棧都將被忽略(除非它們泄漏內存)。 試試這樣吧。

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

首先,你需要明確你關於通過鏈表實現堆棧的概念......

你的 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 函數中,else 部分應該是

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

而且我建議你應該使用 Codeblocks,因為它比 Turbo C++ 有更清晰、更簡單的用戶界面。

您可以通過這篇文章Stack Using Linked List in C++清除您的概念

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM