链栈——栈的链式表示和实现

用链表示的栈的基本操作:

#include<cstdio>
#include<cstdlib> 
#define MAXSIZE 1000	//链表的最大长度 
#define SElemType int 
#define Status int 
//栈的结构
typedef struct LStack{
	SElemType data;		//数据域
	struct LStack *next;	//指针域 
}LStack,*LStackList; 

//初始化
Status InitStack(LStackList &S){
	S = new LStack;
	S->next = NULL;
	return 0; 
}

//入栈
Status Push(LStackList &S,SElemType e){	
	LStackList p = new LStack;		//生成新的结点 
	p->data = e;	//新结点的数据域赋值 
	p->next = S;	//新结点的指针域指向头结点(栈顶) 
	S=p;	//链表的表头更新为新插入的元素; 
	printf("压入栈成功\n");
	return 0; 
} 

//出栈
Status Pop(LStackList &S){
	if(S->next){
		LStackList p = S;
		S=S->next;	//头指针后移 
		free(p);
		printf("出栈成功\n"); 
	}else{
		printf("栈空\n"); 
	}
} 

//创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
void Creat(LStackList &S,int n){
	InitStack(S);
	for(int i=0;i<n;i++){
		int e;
		scanf("%d",&e); 
		Push(S,e);
	}
	printf("创建成功\n");
}  

//遍历,因为是从栈顶(表头)开始的遍历,所以输出的列表是逆序的 
Status StackTraverse(LStackList S){
	printf("遍历开始:\n");
	LStackList p = S;
	/**
	注意:最后一个链表是没有元素的 
	*/ 
	while(p->next){		//最后一个链表是没有元素的 
		printf("%d ",p->data);
		p = p->next;
	} 
	printf("\n"); 
} 

//获取栈的元素个数 
Status StackLength(LStackList S){
	LStackList p = S;
	int count=0;
	while(p){
		p = p->next;
		count++;
	} 
	printf("栈内元素个数为:%d\n",count); 
} 

//判断栈空
bool StackEmpty(LStackList S){
	if(S->next == NULL){
		printf("栈空\n");
		return true; 
	}else{
		printf("栈非空\n");
		return false;
	} 
} 

//获取栈顶元素
Status GetTop(LStackList S,SElemType e){
	//判断栈空 
	if(StackEmpty(S)){
		return 0;
	}else{
		e = S->data;
		printf("栈顶元素为%d\n",e);
		return 0;
	} 
} 

//栈置空
Status ClearStack(LStackList &S){
	if(S->next != NULL)
		S->next = NULL;
	printf("置空操作成功\n");
	return 0; 
}

//销毁链表
Status DestoryStack(LStackList &S){
	//判断是否为空表 
	LStackList p = S;
	LStackList pre = new LStack; 
	while(p->next){
		pre = p;
		p = p->next;
		delete(pre);
	} 
	printf("销毁链表成功\n");
	return 0; 
} 


int main(){
	int n,value1,value2;
	LStackList S;
	printf("请输入元素个数:");                        
	scanf("%d",&n);
	Creat(S,n);
	StackTraverse(S);
	StackLength(S);
	GetTop(S,value1);
	Pop(S);
	StackTraverse(S);
	GetTop(S,value1);
	ClearStack(S);
	StackTraverse(S);
	DestoryStack(S);
	return 0; 
} 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值