对于栈的结构,比如说现在有一个圆筒,有五个直径恰好等于圆筒直径的小球,将五个小球依次放入圆筒中,圆筒恰好被填满。那么此时,第一个放进去的小球就是栈底元素,最后一个放进去的小球就是栈顶元素。如果想要取出第一个小球,那么必须要先把第一个小球上面的四个小球取出才行。也就是说,最先进入圆筒的小球,只能最后才能被取出来;而最后放进去的小球,可以最先被取出来。这就是一个简单的栈。将小球取出的过程即为栈内元素出栈的过程。
如果想用链表来实现栈的功能,其实操作要比创建一个单链表简单的多。
简单之处就在于不需要建立头指针,只需要建立一个top指针和一个临时指针即可。用top指针来指向栈顶元素。
#include <iostream>
using namespace std;
struct node
{
public:
node *next;
int data;
};
class Linkstack
{
public:
Linkstack(){}
~Linkstack(){}
int creatstack(); //创建一个空的链栈
int push(int x); //向栈内压入元素
int pop(); //将元素出栈
int get_top(); //获得栈顶元素
int empty(); //判空操作,如果为空,则返回1
private:
node *p,*top;
};
int Linkstack::creatstack()
{
top = new node;
top=NULL; //此时栈内元素为空
}
int Linkstack::push(int x)
{
if(top==NULL) //压入第一个元素时
{
p = new node;
p->data = x;
p->next = NULL; //此时栈内只有一个元素,所以这个节点的后继指针指向空
top = p;
}
else //当栈内存在元素时
{
p = new node;
p->data = x;
p->next = top; //将结点的指针域指向top
top = p; //然后将p的值赋给top
}
return top->data; //此时返回的就是栈顶元素
}
int Linkstack::get_top()
{
int x;
x = top->data;
return x;
}
int Linkstack::pop()
{
int x;
x = top->data; //先暂存栈顶元素
p = top->next; //暂存栈顶元素的下一个元素的地址
delete top; //将栈顶元素出栈,并清空top内存
top = p; //此时栈内总元素个数-1,top指针向下移动一位
return x;
}
int Linkstack::empty()
{
if(top==NULL)
return 1;
else
return 0;
}
int main()
{
Linkstack l;
l.creatstack();
cout<<"判断链栈是否为空:"<<l.empty()<<endl;
cout<<"入栈的元素为:"<<l.push(1)<<endl;
cout<<"入栈的元素为:"<<l.push(2)<<endl;
cout<<"入栈的元素为:"<<l.push(3)<<endl;
cout<<"入栈的元素为:"<<l.push(4)<<endl;
cout<<"栈顶元素为:"<<l.get_top()<<endl;
cout<<"将栈顶元素出栈:"<<l.pop()<<endl;
cout<<"出栈后栈顶元素为:"<<l.get_top()<<endl;
return 0;
}