数据结构:栈和队列

目录

1.链表和顺序表优缺点

链表

优点:1.带头双向循环链表可在任意位置插入删除节点O(1)。2.按需申请释放空间。

缺点:1.不支持下标随机访问。2.CPU高速缓存命中率会更低。

顺序表

优点:1.尾插尾删效率较高。2.下标随机访问。3.CPU高速缓存命中率会更高。

缺点:1.前面部分插入删除数据,效率是O(N),需要挪动数据。2.空间不够,需要扩容。(扩容是需要付出代价的、一般还会伴随空间的浪费)。

2.栈

栈的概念及结构


实现栈的方式:数组栈

下面用一个动态数组来模拟栈(顺序表)。

c 复制代码
//需要用到的头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
c 复制代码
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;//栈顶元素
	int capacity;//栈空间
}ST;//用顺序表来模拟栈
c 复制代码
//初始化栈
void STInit(ST* pst) 
{
	assert(pst);
	pst->a = NULL;
	//下面有两种方式来定义top
	//pst->top = -1;   //top 指向栈顶数据
	pst->top = 0;//top 指向栈顶数据的下一个位置

	pst->capacity = 0;
}
c 复制代码
//销毁栈
void STDestroy(ST* pst)
{
	asserta(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;
}
c 复制代码
//栈顶插入数据
void STPush(ST* pst, STDataType x)
{
	if (pst->top == pst->capacity)//扩容
	{
		int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity*sizeof(STDataType));
		if (tmp == NULL) {
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newCapacity;
	}

	pst->a[pst->top] = x;
	pst->top++;
}
c 复制代码
//栈顶出数据
void STPop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));//栈不为空再进行删除

	pst->top--;
}
c 复制代码
//获取栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));//栈不为空再获取

	return pst->a[pst->top - 1];
}
c 复制代码
//探空
bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;
}
c 复制代码
//获取size
int STSize(ST* pst)
{
	assert(pst);

	return pst->top;
}

3.队列

队列的概念及结构

队列的实现:链式队列

c 复制代码
//需要用到的头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
c 复制代码
typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;//定义节点
typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;
c 复制代码
//队列初始化
void QueueTnit(Queue* pq)
{
	assert(pq);

	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}
c 复制代码
//队列销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
c 复制代码
//数据从队尾入队列
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	
	QNode* newNode = (QNode*)malloc(sizeof(QNode*));
	if (newNode == NULL)
	{
		perror("malloc fail\n");
		return;
	}
	newNode->data = x;
	newNode->next == NULL;
	if (pq->ptail == NULL)
	{
		assret(pq->phead == NULL);

		pq->phead = newNode;
	}
	else
	{
		pq->ptail->next = newNode;
		pq->ptail = newNode;
		pq->size++;
	}

}
c 复制代码
//数据从对头出队列
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	//一个节点和多个节点
	if (pq->phead->next == NULL)//只有一个节点
	{
		free(pq->ptail);
		pq->phead = pq->ptail = NULL;
	}
	else//有多个节点
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}
c 复制代码
//取对头数据
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->phead->data;
}
c 复制代码
//取队尾数据
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->ptail->data;
}
c 复制代码
//取队列数据个数
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}
c 复制代码
//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->phead == NULL
		&& pq->ptail == NULL;
}
相关推荐
重生之我是Java开发战士23 分钟前
【广度优先搜索】多源BFS:矩阵,飞地的数量,地图中的最高点,地图分析
数据结构·算法·矩阵·广度优先
玛卡巴卡ldf44 分钟前
【LeetCode 手撕算法】(矩阵)73-矩阵置零、54-螺旋矩阵(贪吃蛇)、48-旋转图像
java·数据结构·算法·leetcode·力扣
lcj25111 小时前
蓝桥杯C++:数据结构(功能导向速查)
数据结构·c++·蓝桥杯
拾荒的路由1 小时前
HOT100DAY9记录用
数据结构·算法·leetcode
寒月小酒2 小时前
3.26 OJ
数据结构·算法
宵时待雨3 小时前
C++笔记归纳15:红黑树
开发语言·数据结构·c++·笔记
罗湖老棍子3 小时前
【例 2】A Simple Problem with Integers(信息学奥赛一本通- P1548)
数据结构·算法·线段树·区间修改 区间查询
Yupureki3 小时前
《Linux系统编程》16.进程间通信-共享内存
linux·运维·服务器·c语言·数据结构·c++
Allen_LVyingbo3 小时前
自进化医疗智能体:动态记忆与持续运行的Python架构编程(上)
数据结构·python·架构·动态规划·健康医疗
代码探秘者3 小时前
【算法篇】5.链表
java·数据结构·人工智能·python·算法·spring·链表