速学数据结构 | 我不允许还有人不会用栈实现队列!

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


速学数据结构 | 我不允许还有人不会用栈实现队列!,数据结构,C语言,c++,算法

🎬 鸽芷咕:个人主页

 🔥个人专栏:《Linux深造日志》《C++干货基地》
⛺️生活的理想,就是为了理想的生活!

📋 前言

  🌈hello! 各位铁铁们大家好啊,不知道大家对栈和队列的学习都学过了吧?那么用栈来实现队列你会做嘛?
  ⛳️栈和队列我们前面说了都是一种特殊的线性表,而在学习过程中用栈来尝试实现队列是很有必要来考验一下我们对栈和队列的掌握的!
  📚本期文章收录在《数据结构&算法》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

一、 栈实现队列具体要求

速学数据结构 | 我不允许还有人不会用栈实现队列!,数据结构,C语言,c++,算法

二、栈实现队列的核心思想

  • 栈和队列一个后进先出一个先进先出先先在下图看一下我们的区别:

速学数据结构 | 我不允许还有人不会用栈实现队列!,数据结构,C语言,c++,算法

2.1 如何插入的思想

栈的特点是后进先出而我们要实现的队列是先进先出,诶这刚好和队列的特点相反:

  • 那么我们使用俩个栈
  • 一个用来插入数据
  • 一个用来把插入的数据翻转一下就不可以实现 先进先出的特点 了?

速学数据结构 | 我不允许还有人不会用栈实现队列!,数据结构,C语言,c++,算法

2.2 如何插入呢?

前面说了使用俩个栈来解决队列先进先出的问题,其核心思想就是

  • 一个栈来当 push 栈存放数据
  • 一个栈用来pop数据

那么具体的核心思想是什么?其实只需要把push的 翻转一下然后插入到pop 栈中就好了,这样我们就可以的到一个理论上先进先出的队列了。

  • 每次 pop 的时候都拿翻转完了之后的栈
  • 如何 pop 没有数据了就继续从 push 里面翻转导入数据。

速学数据结构 | 我不允许还有人不会用栈实现队列!,数据结构,C语言,c++,算法

三、栈实现队列的代码实现

核心思路我们有了接下来就是如何实现了,插入和删除解决了。其他问题那就不是问题非常简单就解决了,下面我们来看看把!

3.1 栈实现队列的初始化

初始化和以前一样既然需要俩个栈来模拟实现队列,那么就需要俩个指针来管理栈区就够了:

  • 空间还是和以前 malloc 就好了。
  • 先创建队列的空间在 , malloc 的空间。

📚 代码演示:

typedef struct {
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* new = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&new->pushst);
    STInit(&new->popst);

    return new;
}

3.2 栈实现队列判空

判空这就巨简单了,既然我们用了俩个栈来实现队列那么只要这俩个栈都为空不就行了。

  • 核心思想 STEmpty(&obj->pushst) && STEmpty(&obj->popst)
  • 判断栈区是否为空使用栈的判断就好了

📚 代码演示:

bool myQueueEmpty(MyQueue* obj) {

    return STEmpty(&obj->pushst) && STEmpty(&obj->popst);
}

3.3 栈实现队列的插入

插入这个就是最简单的了,直接往push栈里面插入就好了:

📚 代码演示:

void myQueuePush(MyQueue* obj, int x) {

    STPush(&obj->pushst,x);
}

3.4 栈实现队列删除

删除队列就是我们前面的思想:

  • 每次取pop 栈里面的元素
  • 如果 pop 为空的话那么就从 push栈里面 翻转导入就好了。

📚 代码演示:

int myQueuePop(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    int top = STTop(&obj->popst);   
    STPop(&obj->popst);

    return top;
}

3.5 栈实现队列的头元素

头元素的的访问就很简单了,我们 pop 栈的第一个栈顶元素就是头元素:

  • 去直接访问就好了。
  • 但是要注意 pop 为空的时候就需要导入一下了。

📚 代码演示:

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    return STTop(&obj->popst);
}

3.6 栈实现队列的销毁

销毁还是和以前一样,把malloc的空间都销毁:

  • 然后再销毁队列本身的空间

📚 代码演示:

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->pushst);
    STDestroy(&obj->popst);

    free(obj);
}

四、栈实现队列的成果检验

好了以上就是栈实现队列的全过程了:

  • 对应练习题在这里: 用栈实现队列

📚 代码演示:

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


//#define N 10
//struct Stack
//{
//	int a[N];
//	int top;
//};

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void STInit(ST* ps);
void STDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
STDataType STTop(ST* ps);

int STSize(ST* ps);
bool STEmpty(ST* ps);


void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STDestroy(ST* ps)
{
	assert(ps);

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

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	// 11:40
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity = newCapacity;
	}

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

void STPop(ST* ps)
{
	assert(ps);

	// 
	assert(ps->top > 0);

	--ps->top;
}

STDataType STTop(ST* ps)
{
	assert(ps);

	// 
	assert(ps->top > 0);

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

int STSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

bool STEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}


typedef struct {
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* new = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&new->pushst);
    STInit(&new->popst);

    return new;
}

void myQueuePush(MyQueue* obj, int x) {

    STPush(&obj->pushst,x);
}

int myQueuePop(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    int top = STTop(&obj->popst);   
    STPop(&obj->popst);

    return top;
}

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&obj->popst))
    {
        while(STSize(&obj->pushst))
        {
            STPush(&obj->popst,STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }

    return STTop(&obj->popst);
}

bool myQueueEmpty(MyQueue* obj) {

    return STEmpty(&obj->pushst) && STEmpty(&obj->popst);
}

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->pushst);
    STDestroy(&obj->popst);

    free(obj);
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

📝全篇总结

☁️ 好了以上就是栈的实现队列的全部解析了,总的来说只要掌握技巧就不难呢!核心思想掌握了那就直接秒杀.
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
速学数据结构 | 我不允许还有人不会用栈实现队列!,数据结构,C语言,c++,算法文章来源地址https://www.toymoban.com/news/detail-782386.html

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

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

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

相关文章

  • 速学数据结构 | 二叉树堆的实现详解篇

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,二叉树的概念大家都了解了那么我们今天就看一下    ⛳️ 顺序存储究竟是怎么存储的,如何实现增删查改这些功能。

    2024年02月01日
    浏览(32)
  • 速学数据结构 | 树 森林 二叉树 的概念详讲篇

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,关于线性表我们已经在前面更新完了!    ⛳️ 今天就来看一下复杂一些的数据结构 “树” 他的应用主要在哪些方面

    2024年02月04日
    浏览(31)
  • 速学数据结构 | 手把手教你会单链表的构建方式

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 : 《初阶数据结构》《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊!今天给大家带来的是初阶数据结构中单链表的构建方式,手把手教会你单链表 !    ⛳️ 链表是指一种逻辑上是连在一

    2024年02月08日
    浏览(49)
  • 速学数据结构 | 用队列实现栈你都被难住了?那是你没掌握好技巧

    🎬 鸽芷咕 :个人主页  🔥个人专栏 :《Linux深造日志》《C++干货基地》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位铁铁们大家好啊,栈和队列我们都学过了那么试试用队列实现栈你会嘛?。    ⛳️ 本篇文章就来给大家来篇如何用队列来实现栈的全部解

    2024年02月05日
    浏览(33)
  • SQ工具|2|ArcGIS数据结构(字段名称、字段长度、字段类型、允许为空)的修改

    方式一:借用ArcToolBox中的合并工具(方法来自于GIS思维) 数据管理工具常规合并 右侧四个按钮可实现添加字段、删除字段及调整字顺序的需求   右击目标字段,点击属性,即可实现更改字段名称、类型、长度及允许空值的功能。 点击确定后即可生成所需数据。 但! 我们使

    2024年02月13日
    浏览(80)
  • 【数据结构】我家三岁表弟都明白的栈和队列,你不会不了解吧?

    🧑‍💻作者: @情话0.0 📝专栏:《数据结构》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   栈是只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是对其限定该线性表只能在某一端进行插入或

    2024年01月24日
    浏览(27)
  • 下载加速小妙招,我不允许你不知道

    在你深夜刷剧刷得最激动的时候,屏幕突然打转转…… 在你打游戏打到最精彩的团战时刻,你的网络突然404…… 在你激情澎湃,好不容易抢到心爱之物要付款的时候,页面却突然加载不出来…… 如果真要碰到这些事情,光是想一想就会让人觉得非常崩溃。想要避免这些情况

    2024年02月02日
    浏览(35)
  • SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)

    步骤 选择菜单栏中的“工具”-“选项”,在选项对话框左栏中找到“设计器”,在设计器右边取消勾选“阻止保存要求重新创建表的更改”即可。 图例 注意 设计表时,尽量一次性设计成功,避免使用alter修改表,修改起来有各种约束,不容易修改。 解决: 你设置的数据类型

    2024年02月03日
    浏览(31)
  • 面试被问到vue的diff算法原理,我不允许你回答不上来

    diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行, 不会跨层级比较 在diff比较的过程中,循环从两边向中间比较 diff 算法在很多场景下都有应用,在 vue 中,作用于虚拟 dom 渲染成真实 dom 的新旧 VNode 节点比较 diff 整体策略为:深度

    2023年04月12日
    浏览(30)
  • 所有人不会的计算机盲点

     VLANtag在OSI参考模型的__66___实现。    网络层  转输层  数据链路层  物理层 空)某高校人力资源管理系统的数据库中,教师关系模式为T(教师号,姓名,部门号,岗位,联系地址,薪资),函数依赖集F={教师号→(姓名,部门号,岗位,联系地址),岗位→薪资}。T关系的主键为

    2024年02月03日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包