我试图在堆栈中使用简单的Push,Pop和Show函数作为链表实现。我认为Push功能正常工作,但我在使用Show和Pop时遇到了麻烦。每当我使用Pop函数时,我只得到一个结果,下次它说“ Stack Empty !! ”。我认为我正在做一个逻辑错误。请帮帮我。我正在使用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();
}
答案 0 :(得分:1)
第二次推送后,您不能将temp
节点链接到现有的堆栈&#39;。
if(top==NULL)
{
temp->link=top;
top=temp;
}
为什么你需要这个?我想你每次都要在Push方法中更新top
节点。
答案 1 :(得分:0)
在PUSH
函数中,如果node
为top
,则实际上只对新NULL
执行任何操作,因此忽略所有推送到非空堆栈的操作(除了他们泄漏记忆)。试试吧。
void PUSH() {
temp = new node;
cout << "\nEnter data item:";
cin >> temp->data;
temp->link = top;
top = temp;
}
答案 2 :(得分:0)
首先,你需要清除关于通过链表实现堆栈的概念.....
你的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++
清除您的概念