ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构-栈和队列

2021-10-31 14:04:16  阅读:155  来源: 互联网

标签:head NULL 队列 top assert 数据结构 data


栈和队列

栈的概念

栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
栈中的数据元素遵循后进先出的原则(Last In First Out)
压栈:栈的插入操作叫做进栈/压栈/入栈,在栈顶入数据。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。

在这里插入图片描述

出数据是把栈顶的元素去掉

在这里插入图片描述

栈的实现

结构体的创建

typedef int	STDataType;

typedef struct Stack
{
	STDataType* data;
	int top;			//栈顶	
	int capacity;		//容量
}Stack;

初始化

void StackInit(Stack* s)
{
	assert(s);
	s->data = NULL;
	s->capacity = s->top = 0;
}

打印

void StackPrint(Stack* s)
{
	assert(s);
	int i = 0;
	for (; i < s->top; i++)
	{
		printf("%d->", s->data[i]);
	}
	printf("NULL\n");
}

销毁

void StackDestroy(Stack* s)
{
	assert(s);
	free(s->data);
	s->data = NULL;
	s->capacity = s->top = 0;
}

入栈

void StackPush(Stack* s, STDataType x)
{
	assert(s);

	if (s->capacity == s->top)
	{
		STDataType NewCapacity = s->capacity == 0 ? 4 : s->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(s->data, sizeof(STDataType) * NewCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		s->data = tmp;
		free(tmp);
		s->data[(s->top)++] = x;
		s->capacity = NewCapacity;
	}
	else
	{
		s->data[(s->top)++] = x;
	}
}

出栈

void StackPop(Stack* s)
{
	assert(s);
	assert(s->top > 0);

	s->top--;
}

获取栈顶数据

STDataType StackTop(Stack* s)
{
	assert(s);
	assert(s->top > 0);
	return s->data[s->top-1];
}

获取栈的元素个数

int StackSize(Stack* s)
{
	assert(s);

	return s->top;
}

检查栈是否为空

//.c文件,要引用#include <stdbool.h>这个头文件
bool StackEmpty(Stack* s)
{
	assert(s);

	if (s->top == 0)
		return false;
	else
		return true;
}

队列

队列的概念

队列:只运行在一端进行插入数据操作,在另外一端进行删除数据操作的特殊线性表。
队列具有先进先出原则(First In First Out)
入队列:在队尾插入数据
出队列:在对头删除数据

在这里插入图片描述

队列的实现

使用链表实现效率更高,用数组出数据效率低,所以更多用链表

结构体的创建

typedef int QDataType;

typedef struct ListNode
{
	QDataType data;
	struct ListNode* next;
}ListNode;

typedef struct Queue
{
	ListNode* head;		//队头
	ListNode* tail;		//队尾
}Queue;

初始化

void QueueInit(Queue* q)
{
	assert(q);
	q->head = NULL;
	q->tail = NULL;
}

队尾入数据

void QueuePushBack(Queue* q, QDataType x)
{
	assert(q);
	ListNode* NewNode = BuyListNode(x);
	if (q->head == NULL)
	{
		q->head = q->tail = NewNode;
	}
	else
	{
		q->tail->next = NewNode;
		q->tail = NewNode;
	}
}

队头删数据

void QueuePopFront(Queue* q)
{
	assert(q);
	if (q->head == NULL)
	{
		q->tail = NULL;
	}
	else
	{
		ListNode* next = q->head->next;
		free(q->head);
		q->head = next;
	}
}

获取队列的有效元素

int QueueSize(Queue* q)
{
	assert(q);
	int size = 0;
	ListNode* NewHead = q->head;
	while (NewHead)
	{
		size++;
		NewHead = NewHead->next;
	}
	return size;
}

打印

void QueuePrint(Queue* q)
{
	assert(q);
	ListNode* NewHead = q->head;
	while (NewHead)
	{
		printf("%d->", NewHead->data);
		NewHead = NewHead->next;
	}
	printf("NULL\n");
}

获取队尾元素

QDataType QueueBack(Queue* q)
{
	assert(q);

	return q->tail->data;
}

获取队头元素

QDataType QueueFront(Queue* q)
{
	assert(q);
	return q->head->data;
}

判断是否为空

bool QueueEmpty(Queue* q)
{
	assert(q);
	if (q->head == NULL)
		return true;
	else
		return false;
}

销毁

void QueueDestroy(Queue* q)
{
	assert(q);
	ListNode* cur = q->head;
	while (cur)
	{
		ListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->head = q->tail = NULL;
}

标签:head,NULL,队列,top,assert,数据结构,data
来源: https://blog.csdn.net/qq_43892354/article/details/121061676

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有