链表实现栈的实例图如下:
压栈(入栈)
弹栈(出栈)
完整代码如下:
#include <iostream>
#include <Windows.h>
using namespace std;
typedef int ElemType; //数据类型取别名,方便代码后期维护和修改
typedef struct _Sqinn{
ElemType data; //节点数据域
_Sqinn* next; //节点指针域
}Sqinn,*Linkinn;
typedef struct _Sqinnret{
Linkinn top; //栈顶
int cout; //栈的元素个数
}Sqinnret;
//初始化
bool InitSqinn(Sqinnret* &s){
if(!s)return false;
s = new Sqinnret;
s->top = NULL;
s->cout = 0;
return true;
}
/*
入栈
首先创建一个节点,把插入的数据放进去,
在让栈顶指针指向他,最后cout++
*/
bool SqinnInsert(Sqinnret* &s, ElemType &e){
if(!s)return false;
Sqinn* node = (Sqinn*)malloc(sizeof(Sqinn));
node->next = s->top;
node->data = e;
s->top = node;
s->cout++;
return true;
}
/*
出栈
先new一个节点指向栈顶,然后把栈顶数据放进这个节点
在让栈顶指向这个节点的next,在释放这个节点
最后cout--
*/
bool Sqinnpop(Sqinnret* &s, ElemType &e){
if(!s && s->cout)return false;
Sqinn* node = s->top;
e = node->data;
s->top = node->next;
free(node);
s->cout--;
return true;
}
//栈顶元素
bool GetTop(Sqinnret* &S,ElemType &e){
if(S && S->cout){
e = S->top->data;
return true;
}else{
return false;
}
return true;
}
//返回栈中元素个数
int GetSize(Sqinnret* &S){
return (S->cout);
}
//判断栈是否为空
bool IsEmpty(Sqinnret* &S){
if (!S && S->cout){
return true;
}else{
return false;
}
}
//销毁这个栈
void DestoryStack(Sqinnret* &S) {
if(S->top){
free(S->top);
S->top = NULL;
S->cout = 0;
}
}
int main(){
Sqinnret* S;
int num,x,v;
InitSqinn(S);
cout<<"输入入队元素的个数:";
cin>>num;
cout<<"入队的元素:"<<endl;
while(num--){
cin>>x;
SqinnInsert(S,x);
}
cout<<"栈中的元素个数:"<<GetSize(S)<<endl;
GetTop(S,v);
cout<<"栈顶的元素:"<<v<<endl;
cout<<"依次出栈:";
while(S->top != NULL){
Sqinnpop(S,x);
cout<<x<<'\t';
}
cout<<endl;
DestoryStack(S);
system("pause");
return 0;
}
来源:CSDN
作者:MrLi2019
链接:https://blog.csdn.net/MrLi2019/article/details/104655128