用链表实现栈

独自空忆成欢 提交于 2020-03-04 22:15:42

链表实现栈的实例图如下:

压栈(入栈)
压栈

弹栈(出栈)
弹栈
完整代码如下:

#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;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!