数据结构C语言版-严蔚敏 笔记及源码(4)栈的链式表示和实现

栈的链式表示和实现

栈的链式表示和线性表的链式表示是一样的,所以实现起来也非常的容易

链栈的基本操作有:
InitStack(&S) #栈的初始化
Push(&S,e) #压栈
Pop(&S,&e) #出栈
DestortStack(&S) #销毁栈
StackLength(S) #获取栈的长度
StackTraverse(S,visit()) #以visis()规则遍历栈

运行结果:
在这里插入图片描述
直接上代码(以下代码可以直接复制运行)

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 
#define OVERFLOW -2
typedef int ElemType;  
typedef int Status;  

typedef struct Stack_Node{
	ElemType data;
	struct Stack_Node *next;
}StackNode, *LinkStackNode;

//1.栈的初始化
StackNode *StackInit(void){
  LinkStackNode top;
  top = (StackNode *)malloc(sizeof(StackNode));
  top -> next = NULL;
  return top;
}

//2.压栈
Status Push(LinkStackNode &top,ElemType e){
  StackNode *p;
  p = (StackNode *)malloc(sizeof(StackNode));
  if(!p) return ERROR;
  p -> data = e;
  p -> next = top -> next;
  top -> next = p;
  return OK;
}

//3.出栈
Status Pop(LinkStackNode &top,ElemType &e){
	StackNode *p;
	if(top -> next == NULL) return ERROR;  //空栈
	p = top -> next;
	e = p -> data;
	top -> next = p -> next;
	free(p);
	return OK; 
}

//4.DestoryStack
Status DestoryStack(LinkStackNode &top){
	LinkStackNode pre,p;
	if(top -> next == NULL) return ERROR;  //空栈
	pre = top -> next;
	while(pre){
		p = pre -> next;
		free(pre);
		pre = p;
	}
	top -> next = NULL;
	return OK;
}

//5.StackLength
Status StackLength(LinkStackNode top){
	LinkStackNode p;
	int len = 0;
	if(top -> next == NULL) return len;  //空栈 
	p = top;
	while(p -> next != NULL){
		p = p -> next;
		len++;
	}
	return len;
} 

//6.StackTraverse
Status StackTraverse(LinkStackNode top,Status(visit)(ElemType)){
	
	if(top -> next == NULL) return ERROR;
	
	LinkStackNode p = top;
	while(p -> next != NULL){
		p = p -> next;
		visit(p -> data);
	}
}

int PrintElem(ElemType e){
 	printf("  %d  |\n",e);
 	printf("-----\n");
}


main(){
	int i,len,flag;
	StackNode *S;
	printf("------------初始化栈-------------\n");
	S = StackInit();
	if(S) printf("初始化成功\n");
	else printf("初始化失败\n");

	printf("------------压栈 + 获取长度-------------\n");
	Push(S,2);
	Push(S,3);
	len = StackLength(S);
	printf("当前长度为: %d\n",len);
	
	printf("------------遍历栈-------------\n");
	
	StackTraverse(S,PrintElem);
	
	printf("------------出栈-------------\n");
	Pop(S,i);
	printf("%d\n",i);
	
	printf("------------销毁栈-------------\n");
	flag = DestoryStack(S);
	if(flag) printf("yes\n");
	else printf("No\n");
	flag = Pop(S,i);
	if(flag) printf("出栈成功,值是%d\n",i);
	else printf("空栈\n");
	
	
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值