数据结构|栈和队列以及实现

这篇具有很好参考价值的文章主要介绍了数据结构|栈和队列以及实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、栈

1.1栈的概念及结构

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

示意图:
数据结构|栈和队列以及实现,数据结构
数据结构|栈和队列以及实现,数据结构

1.2栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
两者实现的连续区别:数组栈在空间上是连续的,而链表栈在空间上是不连续的,在逻辑上是连续的。当然不管栈用什么实现,基本上都离不开结构体

区别示意图:
数组栈:
数据结构|栈和队列以及实现,数据结构
链栈:
数据结构|栈和队列以及实现,数据结构

数组栈的增删查改实现,还是分为三大模块,stack.h用来包含头文件及一些给用户看的数据、stack.c程序员用来实现函数的具体内容、test.c测试数组栈

//stack.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

//此为静态栈的结构,实际中一般不实用
//typedef int STDataType;
//typedef struct Stack
//{
//	STDataType a[N];
//	int top;
//}Stack;
  
//支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType *a;
	int top; //用来表示栈顶
	int capacity;//用来表示容量
}Stack;

//初始化栈
void StackInit(Stack* ps);

//入栈
void StackPush(Stack* ps, STDataType data);

//出栈
void StackPop(Stack* ps);

//获取栈顶元素
STDataType StackTop(Stack* ps);

//获取栈中有效元素个数
int StackSize(Stack* ps);

//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps);

//销毁栈
void StackDestroy(Stack* ps);
//stack.c
#include "Stack.h"

//初始化栈
void StackInit(Stack* ps)
{
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

//入栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		ps->capacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
	}
	ps->a[ps->top] = data;
	ps->top++;
}

//出栈
void StackPop(Stack* ps)
{
	assert(ps->top > 0);
	ps->top--;
}

//获取栈顶元素
STDataType StackTop(Stack* ps)
{
	assert(ps->top > 0);
	return ps->a[ps->top-1];
}

//获取栈中有效元素个数
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->top;
}

//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

//销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}
//test.c
//这里是一些测试数据
#include "Stack.h"
#include "Queue.h"


void Stacktest()
{
	Stack s;
	Stack* st = &s;
	StackInit(st);

	StackPush(st, 1);
	StackPush(st, 2);
	StackPush(st, 3);
	StackPush(st, 4);
	StackPush(st, 5);
	while (!StackEmpty(st))
	{
		printf("%d->", StackTop(st));
		StackPop(st);
	}
	printf("\n");
	StackDestroy(st);
}
int main()
{
	Stacktest();
	return 0;
}

测试结果:
数据结构|栈和队列以及实现,数据结构

二、队列

2.1队列的概念及结构

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

示意图:
数据结构|栈和队列以及实现,数据结构

2.2队列的实现

队列当然也可以用数组和链表的结构实现,使用链栈的结构实现要更优一些,因为链式结构在出队列的时候的效率要比数组高,链式结构只要用两个指针可以控制队头队尾,而数组结构在出队头数据的时候无法确定头,需要更多的变量来记录头,效率大大降低

示意图:
数据结构|栈和队列以及实现,数据结构
数据结构|栈和队列以及实现,数据结构
以上为图的形象表示,接下来,我们进行代码来实现此结构,一样分为三个部分,Queue.h,Queue.c,test.c

//Queue.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>


typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;

//队列的结构
typedef struct Queue
{
	QNode* front;
	QNode* rear;
}Queue;

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

//队尾入队列
void QueuePush(Queue* q, QDataType data);

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

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

//获取队尾元素
QDataType QueueBack(Queue* q);

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

//检测队列是否为空,如果为空返回真,如果非空返回假
bool QueueEmpty(Queue* q);

//销毁队列
void QueueDestroy(Queue* q);
//Queue.c
#include "Queue.h"

//初始化队列
void QueueInit(Queue* q)
{
	q->front = NULL;
	q->rear = NULL;
}

//队尾入队列
void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	if (q->front == NULL)
	{
		q->rear = newnode;
		q->rear->data = data;
		q->front = q->rear;
		q->rear->next = NULL;
	}
	else
	{
		q->rear->next = newnode;
		q->rear = newnode;
		q->rear->data = data;
		q->rear->next = NULL;
	}
	

}

//队头出队列
void QueuePop(Queue* q)
{
	assert(q);
	assert(q->front);
	QNode* pnext = q->front->next;
	free(q->front);
	q->front = pnext;
}


//获取队列头部元素
QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(q->front);
	return q->front->data;
}

//获取队尾元素
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->rear);
	return q->rear->data;
}

//获取队列中有效元素个数
int QueueSize(Queue* q)
{
	assert(q);
	assert(q->front);
	QNode* num = q->front;
	int size = 0;
	while (num)
	{
		size++;
		num = num->next;
	}
	return size;
}


//检测队列是否为空,如果为空返回非零结果,如果非空返回0
bool QueueEmpty(Queue* q)
{
	assert(q);
	return q->front == NULL;
}

//销毁队列
void QueueDestroy(Queue* q)
{
	assert(q);
	assert(q->front);
	while (q->front)
	{
		QueuePop(q);
	}
	q->rear = NULL;
}
#include "Queue.h"

void Queuetest()
{
	Queue queue;
	Queue* q = &queue;
	QueueInit(q);

	QueuePush(q, 1);
	QueuePush(q, 2);
	QueuePush(q, 3);
	QueuePush(q, 4);
	QueuePush(q, 5);
	while (!QueueEmpty(q))
	{
		printf("%d->", q->front->data);
		QueuePop(q);
	}
}

int main()
{
	Queuetest();
	return 0;
}

测试结果:
数据结构|栈和队列以及实现,数据结构文章来源地址https://www.toymoban.com/news/detail-698468.html

到了这里,关于数据结构|栈和队列以及实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构基础5:栈和队列的实现。

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

    2024年02月13日
    浏览(39)
  • 数据结构——Java实现栈和队列

    (1)栈是一种线性数据结构 (2)规定只能从栈顶添加元素,从栈顶取出元素 (3)是一种先进后出的数据结构(Last First Out)LIFO Java中可以直接调用方法来实现栈 如何自己写代码来实现栈呢? 先定义一个接口,方便后边进行调用 接下来来实现栈的方法,调用接口,完善方法

    2024年01月20日
    浏览(43)
  • 【数据结构】栈和队列的模拟实现(两个方式实现)

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        这一篇博客将学习栈和队列的相关知识, 栈

    2024年02月05日
    浏览(45)
  • 【数据结构和算法】---栈和队列的互相实现

    具体题目可以参考 LeetCode 232. 用栈实现队列 首先要想到的是,队列是一种 先进先出 的结构,而栈是一种 先进后出 的结构。依此 我们可以定义两个栈结构来模拟先进先出 ,既然要定义两个栈,那么为了方便调用,我们可以将这两个栈结构定义在一个结构体中,如下: 实现

    2024年02月03日
    浏览(42)
  • 数据结构初阶(用C语言实现简单数据结构)--栈和队列

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : 数据结构初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言 这小猫真好看 言归正传,通过上篇有关顺序表和链表的博客,可以了解到线性表的一些大致特征,这篇博

    2024年02月08日
    浏览(42)
  • 数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

      1.利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。   2.利用循环队列实现.约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人出圈;他的下一个人又从1开始报数,数到k的那个人出圈;依

    2024年02月08日
    浏览(42)
  • 数据结构入门(C语言版)栈和队列之队列的介绍及实现

    什么是队列呢?我们先看下面的图: 我们可以理解成高速公路上的隧道,根据这个图的描述 我们把需入队的元素看作一辆车,把队列看作隧道,由此我们可以看出 队列的特点是 只允许从一端进入,从另一端离开。 队列就是只允许在一端进行插入数据操作,在另一端进行删

    2023年04月15日
    浏览(44)
  • 数据结构进阶篇 之 【栈和队列】的实现讲解(附完整实现代码)

    书读一边家里见 书读三遍大专见 书读百遍清北见 书读零遍感谢大哥的穿云箭🚀 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀– 概念

    2024年04月09日
    浏览(44)
  • 【数据结构】带你深入栈和队列,轻松实现各种接口功能

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们继续来学习初阶数据结构的内容,今天我们要讲的是栈与队列内容中队列部分的内容 好了,废话不多说,开始今天的学习吧! — 队列:只允许在一端进行插入数据操作,在另一端进行

    2024年02月13日
    浏览(50)
  • 【数据结构】带你图文结合深入栈和队列,并具体分步实现

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们继续来学习初阶数据结构的内容,今天我们要讲的是栈与队列部分的内容,这篇博客先讲栈,队列我们放到下次再讲 好了,废话不多说,开始今天的学习吧! — 栈:一种特殊的线性表

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包