数据结构 栈与队

目录

栈的概念

栈的实现

队的概念

队的实现


栈的概念

栈(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;
}

输出结果:


感谢观看!

悠仁さん

相关推荐
晴天的雨.99215 分钟前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
淡海水8 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1018 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
2401_8390805412 小时前
C++常见八股
数据结构·c++·算法
暮雨封夕12 小时前
跳表(Skip List)详解:原理、实现、使用场景与实际应用
数据结构
miller-tsunami12 小时前
排序的相关知识点
数据结构·排序算法
Logic10117 小时前
C语言/数据结构滑动窗口题解:替换k个字符后的最长连续相同字符子串(LeetCode 424)
c语言·数据结构·字符串·滑动窗口·时间复杂度·频率统计·算法题
程序员阿鹏18 小时前
简单介绍一下软引用
java·开发语言·jvm·数据结构·后端
爱奥尼欧19 小时前
【C++】map、set 的底层是什么?红黑树五条性质、插入旋转到模拟实现
开发语言·数据结构·c++
动词ing20 小时前
【题目练习】动态规划+背包问题
数据结构·目标检测