数据结构之栈

定义:一种可以“先进后出”的存储结构
分类:静态栈,动态栈
算法:压栈,出栈
应用:函数调用,中断,表达式求值,内存分配,缓冲处理,迷宫

代码实现

与链表实现类似,依旧需要先创建结点

typedef struct Node{//先创建结点
	int data;//结点数据域
	struct Node *next;//结点指针域
}NODE, *PNODE;
//其中NODE等价struct Node 
//PNODE 等价 struct Node *


typedef struct Stack{//创建栈
	PNODE pTop;//栈顶
	PNODE pBottom;//栈底
}STACK, *PSTACK;
//其中STACK等价struct Stack
//PSTACK 等价 struct Stack *

初始化栈

void init_stack(PSTACK pS){
	pS->pTop = (PNODE)malloc(sizeof(NODE));//给栈顶分配内存
	if(NULL == pS->pTop){
		printf("分配内存失败,程序中止!\n");
		exit(-1);
	}
	else{
		pS->pBottom = pS->pTop;//空栈,栈顶栈底指向同一个结点
		pS->pTop->next = NULL;//指向的结点指针域与NULL
	}
	return ;
}

压栈

void push_stack(PSTACK pS,int val){
	PNODE pNew = (PNODE)malloc(sizeof(NODE));//建立一个新的结点
	if(NULL == pNew){
		printf("内存分配失败,程序中止\n");
		exit(-1);
	}
	else{
		pNew->data = val;//存入结点数据
		pNew->next = pTop;//将新的结点指向Top所指的结点
		pTop->next = pNew;//将top指向新的结点
		return ;
	}
}

遍历栈

void traverse_stack(PSTACK pS){
	PNODE p = pS->pTop;
	while(p != pS->Bottom){
		printf("%d\t",p->data);
		p = p->next;
	}
	printf("\n");
	return ;
}

判断栈是否为空

void is_empty(PSTACK pS){
	if(pS->pTop == pS->pBottom){
		return true;
	}
	else{
		return false;
	}

}

出栈

bool pop_stack(PSTACK pS,int *Pval){
	if(is_empty(pS)){
		return false;
	}
	else{
		PNODE p = pS->pTop;//新的结点保存栈顶
		pS->pTop = p->next;//栈顶指向下一个结点
		*Pval = p->data;//数据域赋值
		free(p);
		p = NULL;
		return ture;
	}
}

清空栈

void clear(PSTACK pS){
	if(is_empty(pS)){
		return ;
	}
	else{
		PNODE p = pS->pTop;
		PNODE q = NULL;
		while(p != pS->pBottom){
			q = p->next;
			free(p);
			p = q;	
		}
		pS->pTop = pS->pBottom;
	}
	return ;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值