使用链表在 c++ 中堆栈嵌入

Stack implemantation in c++ using linked list

本文关键字:堆栈 c++ 链表      更新时间:2023-10-16
#include<iostream>
#include<cstdlib>
using namespace std;
struct node
{
int data;   //data
node *next; //link
};
class stack // stack using linked list
{
public:
node *top; // top element of stack
public:
stack()
{
top= NULL;
}
void push(int value)
{
node *temp  = new node; // create a new node
temp-> data = value;
temp-> next = NULL;
if(top==NULL)          //  stack is empty
{
top=temp;
temp=NULL;
}
else
{
temp-> next = top;
top=temp;
temp=NULL;
}
}
//template <class X>
void pop()
{
if(top==NULL)
{
cout<<"nStackOverflow "<<endl;
cout<<"Program Terminated "<<endl;
exit (0);
}
else
{
top=top->next;
}
}
void display()
{
node *temp=new node;
temp=top;
while(temp!=NULL)
{
cout<<temp->data<<" ";
temp = temp-> next;
}
while(top==NULL)
{ 
cout<<"nStack is Empty "<<endl;  
exit (0);
}

}
};
int main()
{
stack a;
a.push(5);
a.display();
a.push(10);
a.display();
a.pop();
a.pop();
a.push(20);
a.display();
a.pop();
a.display();
return 0;
}

此代码的输出为 5 10 5 20 堆栈为空。

哪个是错误的输出,正确的输出是 5 10 20 堆栈为空。.

有人告诉我为什么会发生此错误。

代码的引用:[在 c++ 中使用模板和链表实现堆栈

不,输出是正确的。

a.push(5);
a.display();

这将显示第一个5

a.push(10);
a.display();

5仍在堆栈上,因此现在显示10,然后显示5

a.pop();
a.pop();
a.push(20);
a.display();

现在所有内容都被删除,20被添加并显示,所以这应该只显示20.

然后空堆栈打印

a.pop();
a.display();

所以放在一起,它应该显示5 10 5 20 Stack is Empty.

a.push(5);     // Stack:  5
a.display();   // Output: new: 5
a.push(10);    // Stack:  10 5
a.display();   // Output: old: 5 new: 10 5
a.pop();       // Stack:  5
a.pop();       // Stack:  empty
a.push(20);    // Stack:  20
a.display();   // Output: old: 5 10 5 new: 20
a.pop();       // Stack:  empty
a.display();   // Output: old: 5 10 5 20 new: 

stack()
{
top= NULL;  // use initializ list instead of assignment
// in constructors body
}

-->

stack() : top{ nullptr } {}

void pop()
{
if (top == NULL)
{
cout << "nStackOverflow " << endl;
cout << "Program Terminated " << endl;
exit(0);  // don't use exit() in C++ if there are other ways!
}
else
{
top = top->next; // the memory top pointed to
// before the assignment leaks!
}
}

-->

void pop()
{
if (!top) {
cout << "Pop on empty stack!n";
return;
}
node *old_top = top;
top = top->next;
delete old_top;
}

void display()
{
node *temp = new node;  // no need to allocate a node in a
// function that should only make output
temp = top;             // the memory temp points to before the
// assignment leaks
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
while (top == NULL)  // why a loop?
{
cout << "nStack is Empty " << endl;
exit (0);   // again ...
}
}

-->

void display() const
{
if (!top) {
std::cout << "Stack is empty!n";
return;
}
for(node *current = top; current; current = current->next)
cout << current->data << ' ';
}