数据结构 栈与队

目录

栈

栈的概念

栈的实现

队

队的概念

队的实现


栈

栈的概念

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

输出结果:


感谢观看!

悠仁さん

相关推荐
A boy CDEF girl4 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
图灵-M8 小时前
【数据结构】静态 & 动态顺序表
c语言·数据结构·笔记
careathers8 小时前
【数据结构】基于比较的排序算法 - 选择排序
数据结构·算法·排序算法
XiYang-DING10 小时前
P4104.环形链表判断
数据结构·链表
逆向编程10 小时前
MATLAB高级数据结构:cell、struct与table深度应用
开发语言·数据结构·matlab
m0_639906941 天前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
2601_970703831 天前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
丘山望岳1 天前
单调栈和单调队列
数据结构
UIU1141 天前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
黎相思2 天前
BTree
数据结构·b树·b+树