数据结构:链栈

一、介绍

操作受限的链表

如果进行头插,就只能头删

如果进行尾插,就只能进行尾删

二、功能(把T->ptop当做头节点用)

链栈的结构体

cs 复制代码
#ifndef __LINK_STACK_H__
#define __LINK_STACK_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct link_stack{
	int data;
	struct link_stack *next;
}link_stack,*link_p;

//桟顶指针的类型
//桟顶指针应该独立于桟存在,为了和桟中元素不同
typedef struct top_t{
	int len;//记录链桟的长度
	link_p ptop;//桟顶指针
}top_t,*top_p;

//申请桟顶指针
top_p creat_top();
//申请节点的函数
link_p creat_node(int data);
//判空
int empty(top_p T);
//入桟
void push_stack(top_p T,int data);
//出桟
void pop_stack(top_p T);
//遍历
void show_stack(top_p T);
//销毁链桟
void free_stack(top_p T);

#endif

1.申请栈顶指针

cs 复制代码
//申请桟顶指针
top_p creat_top(){
	top_p top=(top_p)malloc(sizeof(top_t));
	if(top==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	top->len=0;
	top->ptop=NULL;//刚申请桟指针没有指向元素
	return top;
}

2.申请节点

cs 复制代码
//申请节点的函数
link_p creat_node(int data){
	link_p new=(link_p)malloc(sizeof(link_stack));
	if(new==NULL){
		printf("申请空间失败\n");
		return NULL;
	}
	new->data=data;
	return new;
}

3.判空

cs 复制代码
//判空
int empty(top_p T){
		if(T==NULL){
		printf("申请空间失败\n");
		return 0;
	}
		return T->ptop==NULL?1:0;

}

4.入栈

cs 复制代码
//入桟
void push_stack(top_p T,int data){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
	link_p new=creat_node(data);
	new->next=T->ptop;
	T->ptop=new;
	T->len++;
}

5.出栈

cs 复制代码
void pop_stack(top_p T){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
	if(empty(T)){
printf("链桟为空,无需出桟\n");
return;
	}
	link_p p=T->ptop;
	while(p->next->next!=NULL){
		p=p->next;
	}
	link_p del=p->next;
	p->next=del->next;
	free(del);
	T->len--;
}

6.遍历

cs 复制代码
//遍历
void show_stack(top_p T){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
if(empty(T)){
	printf("链桟为空\n");
	return;
}
link_p p=T->ptop;
while(p!=NULL){
	printf("%d ",p->data);
	p=p->next;
}
putchar(10);
}

7.销毁链栈

复制代码
//销毁链桟
void free_stack(top_p T){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
	if(empty(T)){
		printf("链桟为空\n");
		return;
	}
	//循环出桟
	link_p p=T->ptop->next;
	link_p del;
	while(p!=NULL){
		del=p;
		p=p->next;
		free(del);
		del=NULL;
	}

}
相关推荐
CodeByV12 分钟前
【算法题】链表
数据结构·算法
wen__xvn32 分钟前
代码随想录算法训练营DAY15第六章 二叉树part03
数据结构·算法·leetcode
无限进步_42 分钟前
【C语言&数据结构】二叉树链式结构完全指南:从基础到进阶
c语言·开发语言·数据结构·c++·git·算法·visual studio
好奇龙猫1 小时前
大学院-筆記試験練習:线性代数和数据结构(8)
数据结构·线性代数
Dylan的码园2 小时前
深入浅出Java排序:从基础算法到实战优化(上)
java·数据结构·算法
学嵌入式的小杨同学2 小时前
循环队列(顺序存储)完整解析与实现(数据结构专栏版)
c语言·开发语言·数据结构·c++·算法
jimy12 小时前
消息队列Message Queue(MQ),队列链表(queue),消费者,生产者
数据结构·链表
小欣加油2 小时前
leetcode 面试题17.16 按摩师
数据结构·c++·算法·leetcode·动态规划
sin_hielo2 小时前
leetcode 3454(扫描线模板题:矩形面积并)
数据结构·算法·leetcode