数据结构 栈与队

目录

栈的概念

栈的实现

队的概念

队的实现


栈的概念

栈(stack)是一种线性表,与其他线性表相比删除与输入都是再同一个地方进出

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈的实现

栈的结构体与初始化

stack.h

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int SNODEDetaTpye;
typedef struct StackNODE
{
	SNODEDetaTpye data;
	struct StackNODE* next;
}SNODE;

void SNODEInit(SNODE* head);//初始化

void SNODEDestory(SNODE* head);//销毁栈

stack.c

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS

#include "stack.h"

void SNODEInit(SNODE* head)//初始化函数
{
	head->next = NULL;
	head->data = 0;
	return;
}

栈的销毁函数

cpp 复制代码
void SNODEDestory(SNODE* head)//销毁栈
{
	SNODE* dest, *pnode = head->next;
	while (pnode != NULL)
	{
		dest = pnode;
		pnode = pnode->next;
		free(dest);
		dest = NULL;
	}
	
	return;
}

判断栈的是否为空栈

cpp 复制代码
bool SNODEEmpty(SNODE* head)//判断是否为空栈
{
	if (head->next == NULL)
		return true;
	else
		return false;
}

栈的入栈函数

cpp 复制代码
void SNODEPush(SNODE* phead, SNODEDetaTpye a)//入栈函数
{  
	SNODE* newhead = (SNODE*)malloc(sizeof(SNODE));
	if (newhead == NULL)
	{
		perror("malloc");
		exit(1);
	}
	newhead->next = phead->next;
	phead->next = newhead;
	phead->next->data = a;
	return;
}

void Print(SNODE* head)//输出
{
	SNODE* phead = head;
	phead = phead->next;
	while (phead)
	{
		printf(" %d ->", phead->data);
		phead = phead->next;
	}
	printf("\n");
	return;
}

int main()
{
	SNODE head;

	SNODEInit(&head);
	SNODEPush(&head, 1);
	SNODEPush(&head, 2);
	SNODEPush(&head, 3);
	SNODEPush(&head, 4);
	Print(&head);

	SNODEDestory(&head);
	return 0;
}

栈的出栈函数

cpp 复制代码
void SNODEPop(SNODE* head)
{
	if (SNODE_Empty(head))
	{
		printf("栈为空函数\n");
		return;
	}
	else
	{
		SNODE* pop = head->next;
		head->next = head->next->next;
		free(pop);
		pop = NULL;
	}
	return;
}
int main()
{
	SNODE head;

	SNODEInit(&head);
	SNODEPush(&head, 1);
	SNODEPush(&head, 2);
	SNODEPush(&head, 3);
	SNODEPush(&head, 4);

	Print(&head);
	SNODE_Pop(&head);

	Print(&head);
	SNODE_Pop(&head);	

	Print(&head);
	SNODE_Pop(&head);

	Print(&head);
	SNODE_Pop(&head);

	Print(&head);
	SNODE_Pop(&head);

	SNODEDestory(&head);
	return 0;
}

取栈的有效元素个数

cpp 复制代码
int SNODE_Fine(SNODE* head)//查找有效元素个数,就是入栈的个数
{
	SNODE* phead = head->next;
	int num=0;
	while (phead)
	{
		num++;
		phead = phead->next;
	}
	return num;
}

int main()
{
	SNODE head;

	SNODEInit(&head);
	SNODEPush(&head, 1);
	SNODEPush(&head, 2);
	SNODEPush(&head, 3);
	SNODEPush(&head, 4);
	printf("有效个数:%d\n", SNODE_Fine(&head));

	Print(&head);
	SNODE_Pop(&head);
	printf("有效个数:%d\n", SNODE_Fine(&head));

	Print(&head);
	SNODE_Pop(&head);	
	printf("有效个数:%d\n", SNODE_Fine(&head));

	Print(&head);
	SNODE_Pop(&head);
	printf("有效个数:%d\n", SNODE_Fine(&head));

	Print(&head);
	SNODE_Pop(&head);
	printf("有效个数:%d\n", SNODE_Fine(&head));

	Print(&head);
	SNODE_Pop(&head);
	printf("有效个数:%d\n", SNODE_Fine(&head));

	SNODEDestory(&head);
	return 0;
}

队的概念

(queue)

在现实世界里,排队我们肯定从队尾进入,从队头出去,那么队的概念就是这样的,有两个口一个负责入队,一个口负责出队。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

队的实现

队的结构体和头尾指针结构体

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int DateType;
typedef struct queuendoe
{
	DateType data;
	struct queuenode* next;
}QN;

typedef struct queue
{
	QN* phead;
	QN* ptail;
	int size;
}Q;

队的初始函数

cpp 复制代码
void queue_init(Q* queue)//初始化
{
	QN* phead = (QN*)malloc(sizeof(QN));//哨兵位
	if (phead == NULL)
	{
		perror("malloc");
		exit(1);
	}
	phead->next = NULL;

	queue->phead = queue->ptail = phead;
	queue->size = 0;
	return;
}

队的销毁函数

cpp 复制代码
void queue_destory(Q* queue)//销毁队
{
	QN* dest;
	while (queue->phead != queue->ptail)
	{
		dest = queue->phead;
		queue->phead = queue->phead->next;
		free(dest);
		dest = NULL;
		queue->size--;
	}
	printf("队列销毁成功");
	return;
}

队的入队函数

cpp 复制代码
void queue_push(Q* queue, DateType a)//入队
{
	QN* node = (QN*)malloc(sizeof(QN));
	if (node == NULL)
	{
		perror("malloc");
		exit(1);
	}
	node->data = a;
	node->next = NULL;
	queue->ptail->next = node;
	queue->ptail = node;
	queue->size++;
	return;
}

队的出队函数

cpp 复制代码
void queue_pop(Q* queue)//出队函数
{
	assert(queue!=NULL);
    
    if (queue->size)
	{
		QN* pop;
		pop = queue->phead;
		queue->phead = queue->phead->next;
		free(pop);
		pop = NULL;
		queue->size--;
	}
	else
	{
		printf("队列为空\n");
	}
	return;
}

主函数的实现

cpp 复制代码
void print(Q* queue)//输出
{
	QN* p = queue->phead->next;
	while (p != NULL)
	{
		printf(" %d ->", p->data);
		p = p->next;
	}
	printf("\n");

	return;
}

int main()
{
	Q queue;
	queue_init(&queue);
	queue_push(&queue, 1);
	queue_push(&queue, 2);
	queue_push(&queue, 3);
	queue_push(&queue, 4);
	print(&queue);

	queue_pop(&queue);
	print(&queue);

	queue_pop(&queue);
	print(&queue);	
	
	queue_pop(&queue);
	print(&queue);	
	
	queue_pop(&queue);
	print(&queue);
	queue_pop(&queue);

	queue_init(&queue);
	queue_push(&queue, 1);
	queue_push(&queue, 2);
	queue_push(&queue, 3);
	queue_push(&queue, 4);
	print(&queue);
	queue_destory(&queue);
	
	return;
}

输出结果:


感谢观看!

悠仁さん

相关推荐
Plan-C-3 小时前
二叉树的遍历
java·数据结构·算法
历程里程碑3 小时前
54 深入解析poll多路复用技术
java·linux·服务器·开发语言·前端·数据结构·c++
一切皆是因缘际会4 小时前
AI Agent落地困局与突破:从技术架构到企业解析
数据结构·人工智能·算法·架构
qeen874 小时前
【算法笔记】各种常见排序算法详细解析(下)
c语言·数据结构·c++·笔记·学习·算法·排序算法
欢璃4 小时前
笔试强训练习
java·开发语言·jvm·数据结构·算法·贪心算法·动态规划
Cthy_hy6 小时前
并查集(Disjoint Set Union):巧判「连通聚类关系」的极简利器
数据结构·算法
阿Y加油吧6 小时前
两道位运算 / 摩尔投票经典题复盘:只出现一次的数字 & 多数元素
数据结构·算法·leetcode
05候补工程师7 小时前
【408狂飙·数据结构】核心考点深度复盘:数组地址计算、特殊矩阵压缩存储与树的五大性质解题直觉
数据结构·笔记·线性代数·考研·算法·矩阵
炘爚8 小时前
数据结构:顺序表
数据结构