#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堆栈为空。
任何人都告诉我为什么会发生此错误。
代码参考:[{Implementation of stack using Templates and And Linked List in c++
答案 0 :(得分:6)
否,输出正确。
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
。
答案 1 :(得分:4)
<section class="section">
<div class="columns">
<div class="column">
<!-- column 1 -->
</div>
<div class="column">
<!-- column 2 -->
</div>
</div>
</section>
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 ...
}
}