【数据结构】栈和队列

栈和队列

1.栈

1.1栈的实现参考代码

c 复制代码
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int STDataType;

//数组实现的动态栈
typedef struct Stack
{
	STDataType* a;
	int top;//栈顶
	int capacity;//总空间
}ST;

//初始化栈
void STInit(ST* pst);

//检查空间是否足够
void CheckCapacity(ST* pst);

//插入栈顶元素
void STPush(ST* pst, STDataType x);

//删除栈顶元素
void STPop(ST* pst);

//获取栈顶元素
STDataType STTop(ST* pst);

//检查栈是否为空
bool STEmpty(ST* pst);

//栈的大小
int STSize(ST* pst);

//栈的销毁
void STDestory(ST* pst);

#include"Stack.h"

//检查空间是否足够
void CheckCapacity(ST* pst)
{
	assert(pst);

	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("CheckCapacity()::relloc():");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
}

//初始化栈
void STInit(ST* pst)
{
	assert(pst);

	pst->a = NULL;
	pst->top = 0;//这里的栈顶指的是下一个存放元素的位置下标处
	pst->capacity = 0;
}

//插入栈顶元素
void STPush(ST* pst, STDataType x)
{
	assert(pst);

	CheckCapacity(pst);

	pst->a[pst->top] = x;
	pst->top++;
}

//删除栈顶元素
void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);//栈内不为空

	pst->top--;
}

//获取栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);

	return pst->a[pst->top - 1];
}

//检查栈是否为空
bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;//为空就返回真
}

//栈的大小
int STSize(ST* pst)
{
	assert(pst);

	return pst->top;
}

//栈的销毁
void STDestory(ST* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;
}

1.2栈的概念

允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底
。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。

1.3栈的实现

栈的实现一般可以使用数组或者链表 实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

2.队列

2.1队列的实现参考代码

c 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int QDataType;
typedef struct QueueNode
{
	QDataType val;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

//队列的初始化
void QueueInit(Queue* pq);

//队尾入队列
void QueuePush(Queue* pq, QDataType x);

//队头出队列
void QueuePop(Queue* pq);

//获取队列尾部元素
QDataType QueueBack(Queue* pq);

//获取队列头部元素
QDataType QueueFront(Queue* pq);

//检测队列是否为空(为空返回非0,不为空返回0)
bool QueueEmpty(Queue* pq);

//销毁队列
void QueueDestory(Queue* pq);

//获取对列中有效元素个数
int QueueSize(Queue* pq);

#include"Queue.h"

//队列的初始化
void QueueInit(Queue* pq)
{
	assert(pq);

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

//插入数据
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("QueuePush()::malloc()");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;

	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}

	pq->size++;
}

//队头出队列
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	QNode* del = pq->phead;
	pq->phead = pq->phead->next;
	free(del);
	del = NULL;

	if (pq->phead == NULL)
		pq->ptail = NULL;

	pq->size--;
}

//获取队列尾部元素
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->ptail->val;
}

//获取队列头部元素
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->phead->val;
}

//检测队列是否为空(为空返回非0,不为空返回0)
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->phead == NULL;
}

//获取对列中有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

//销毁队列
void QueueDestory(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* del = cur;
		cur = cur->next;
		free(del);
	}

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

2.2队列的概念及结构

队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头.

2.3队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些 ,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

相关推荐
MATLAB代码顾问13 分钟前
多种时间序列预测算法的MATLAB实现
开发语言·算法·matlab
高山上有一只小老虎1 小时前
字符串字符匹配
java·算法
愚润求学2 小时前
【动态规划】专题完结,题单汇总
算法·leetcode·动态规划
MOONICK2 小时前
数据结构——哈希表
数据结构·哈希算法·散列表
林太白2 小时前
跟着TRAE SOLO学习两大搜索
前端·算法
ghie90903 小时前
图像去雾算法详解与MATLAB实现
开发语言·算法·matlab
云泽8083 小时前
从三路快排到内省排序:探索工业级排序算法的演进
算法·排序算法
weixin_468466853 小时前
遗传算法求解TSP旅行商问题python代码实战
python·算法·算法优化·遗传算法·旅行商问题·智能优化·np问题
FMRbpm4 小时前
链表5--------删除
数据结构·c++·算法·链表·新手入门
程序员buddha4 小时前
C语言操作符详解
java·c语言·算法