数据结构9:栈和队列的相互实现

文章目录

  • 队列实现栈
    • 头文件
      • Queue.h
      • MyStack.h
    • 实现文件
      • Queue.c
      • MyStack.c
  • 栈实现队列
    • 头文件
      • Stack.h
      • MyQueue.h
    • 实现文件
      • Stack.c
      • MyQueue.c

队列实现栈

头文件

Queue.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QListDataType;typedef struct QListNode {QListDataType val;struct QListNode* next;
}QListNode;typedef struct Queue {QListNode* head;QListNode* tail;int size;
}Queue;//初始化
void QueueInit(Queue* pq);//销毁
void QueueDestroy(Queue* pq);//队尾入队列
void QueuePush(Queue* pq, QListDataType x);//对头出队列
void QueuePop(Queue* pq);//获取队列头部元素
QListDataType QueueFront(Queue* pq);//获取队列队尾元素
QListDataType QueueBack(Queue* pq);//获取队列中有效元素个数
int QueueSize(Queue* pq);//检查队列是否为空,空返回真,非空返回假
bool QueueEmpty(Queue* pq);

MyStack.h

#pragma once#include"Queue.h"typedef struct {Queue q1;Queue q2;
} MyStack;//初始化
MyStack* myStackCreate();//压栈
void myStackPush(MyStack* obj, int x);//出栈并返回栈顶元素
int myStackPop(MyStack* obj);//获取栈顶元素
int myStackTop(MyStack* obj);//判空
bool myStackEmpty(MyStack* obj);//销毁
void myStackFree(MyStack* obj);

实现文件

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1#include"Queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->head = NULL;pq->tail = NULL;pq->size = 0;
}//销毁
void QueueDestroy(Queue* pq)
{assert(pq);QListNode* cur = pq->head;while (cur){QListNode* next = cur->next;free(cur);cur = next;}pq->head = NULL;pq->tail = NULL;pq->size = 0;
}//队尾入队列
void QueuePush(Queue* pq, QListDataType x)
{assert(pq);QListNode* newnode = (QListNode*)malloc(sizeof(QListNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->tail == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}//队头出队列
void QueuePop(Queue* pq)
{assert(pq);assert(pq->size);QListNode* tmp = pq->head->next;free(pq->head);pq->head = tmp;if (pq->head == NULL)pq->tail = NULL;pq->size--;
}//获取队列头部元素
QListDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->size);return pq->head->val;
}//获取队列队尾元素
QListDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->size);return pq->tail->val;
}//获取队列中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}//检查队列是否为空,空返回真,非空返回假
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}

MyStack.c

#define _CRT_SECURE_NO_WARNINGS 1#include"MyStack.h"MyStack* myStackCreate() {MyStack* new = (MyStack*)malloc(sizeof(MyStack));if (new == NULL){perror("malloc fail");return NULL;}QueueInit(&(new->q1));QueueInit(&(new->q2));return new;
}void myStackPush(MyStack* obj, int x) {assert(obj);if (QueueEmpty(&(obj->q1))){QueuePush(&(obj->q2), x);}else{QueuePush(&(obj->q1), x);}
}int myStackPop(MyStack* obj) {assert(obj);assert(!(QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2))));Queue* full = &(obj->q2);Queue* empty = &(obj->q1);if (QueueEmpty(&(obj->q2))){full = &(obj->q1);empty = &(obj->q2);}while (QueueSize(full) > 1){int tmp = QueueFront(full);QueuePop(full);QueuePush(empty, tmp);}int ret = QueueFront(full);QueuePop(full);return ret;
}int myStackTop(MyStack* obj) {assert(obj);assert(!(QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2))));int ret = 0;if (QueueEmpty(&(obj->q1))){ret = QueueBack(&(obj->q2));}else{ret = QueueBack(&(obj->q1));}return ret;
}bool myStackEmpty(MyStack* obj) {assert(obj);return (QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2)));
}void myStackFree(MyStack* obj) {assert(obj);QueueDestroy(&(obj->q1));QueueDestroy(&(obj->q2));free(obj);obj = NULL;
}

栈实现队列

头文件

Stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>#define CAPACITY_INIT 4typedef int STDataType;typedef struct Stack {STDataType* a;int size;int capacity;
}Stack;//栈的初始化
void StackInit(Stack* ps);//压栈
void StackPush(Stack* ps, STDataType x);//出栈
void StackPop(Stack* ps);//获取栈顶元素
STDataType StackTop(Stack* ps);//获取栈中有效数据个数
int StackSize(Stack* ps);//检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);//栈的销毁
void StackDestroy(Stack* ps);

MyQueue.h

#pragma once
#include"Stack.h"
#include<stdbool.h>typedef struct {Stack in;Stack out;
} MyQueue;//初始化
MyQueue* myQueueCreate();//将元素 x 推到队列的末尾
void myQueuePush(MyQueue* obj, int x);//从队列的开头移除并返回元素
int myQueuePop(MyQueue* obj);//返回队列开头的元素
int myQueuePeek(MyQueue* obj);//如果队列为空,返回 true ;否则,返回 false
bool myQueueEmpty(MyQueue* obj);//销毁
void myQueueFree(MyQueue* obj);

实现文件

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
#include<string.h>//栈的初始化
void StackInit(Stack* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * CAPACITY_INIT);if (ps->a == NULL){perror("malloc fail!");return;}ps->size = 0;ps->capacity = CAPACITY_INIT;
}//判断是否需要扩容
void StackChekCapacity(Stack* ps)
{assert(ps);if (ps->size == ps->capacity){ps->a = (STDataType*)realloc(ps->a, sizeof(STDataType) * (ps->capacity) * 2);if (ps->a == NULL){perror("realloc fail!");return;}ps->capacity *= 2;}
}//压栈
void StackPush(Stack* ps, STDataType x)
{assert(ps);StackChekCapacity(ps);ps->a[ps->size++] = x;
}//出栈
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps->size--;
}//获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->a[ps->size - 1];
}//获取栈中有效数据个数
int StackSize(Stack* ps)
{assert(ps);return ps->size;
}//检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{assert(ps);if (ps->size == 0)return 1;elsereturn 0;
}//栈的销毁
void StackDestroy(Stack* ps)
{assert(ps);ps->size = 0;ps->capacity = 0;free(ps->a);
}

MyQueue.c

#define _CRT_SECURE_NO_WARNINGS 1#include<string.h>
#include"MyQueue.h"MyQueue* myQueueCreate() {MyQueue* new = (MyQueue*)malloc(sizeof(MyQueue));if (new == NULL){perror("malloc fail");return NULL;}StackInit(&new->in);StackInit(&new->out);return new;
}void myQueuePush(MyQueue* obj, int x) {assert(obj);StackPush(&obj->in, x);
}int myQueuePop(MyQueue* obj) {assert(obj);assert(!(StackEmpty(&obj->in) && StackEmpty(&obj->out)));if (StackEmpty(&obj->out)){while (StackSize(&obj->in) > 0){int tmp = StackTop(&obj->in);StackPop(&obj->in);StackPush(&obj->out, tmp);}}int ret = StackTop(&obj->out);StackPop(&obj->out);return ret;
}int myQueuePeek(MyQueue* obj) {assert(obj);assert(!(StackEmpty(&obj->in) && StackEmpty(&obj->out)));if (StackEmpty(&obj->out)){while (StackSize(&obj->in) > 0){int tmp = StackTop(&obj->in);StackPop(&obj->in);StackPush(&obj->out, tmp);}}int ret = StackTop(&obj->out);return ret;
}bool myQueueEmpty(MyQueue* obj) {assert(obj);return StackEmpty(&obj->in) && StackEmpty(&obj->out);
}void myQueueFree(MyQueue* obj) {assert(obj);StackDestroy(&obj->in);StackDestroy(&obj->out);free(obj);obj = NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂设备数据采集

在信息化浪潮席卷全球的时代背景下&#xff0c;工厂设备数据采集成为推动企业数字化转型和智能化升级的关键环节。HiWoo Box网关以其卓越的性能和便捷的操作&#xff0c;为工厂设备数据采集提供了强有力的支持。本文将深入探讨工厂设备数据采集的概念&#xff0c;阐述如何利用H…

企业用户管理passwd/sudo工作原理/chage/用户组/切换用户及提权管理/chown知识详谈-6000字

passwd 用户自己给自己设置密码&#xff1a;直接passwd root用户给普通用户设置密码&#xff1a;passwd用户名 stdin 从标准输入获取信息 批量创建用户&#xff1a; bash脚本&#xff1a; for n in {01…10} do useradd wulin$n done n先取01然后循环&#xff0c;再取再执行…

Java中的函数式编程1

Functional Programming In OOP 引言 函数式编程是一种编程泛型&#xff0c;将所有的运算都视为函数&#xff0c;只要输入相同的数据&#xff0c;就能得到稳定的输出。然而由于它的抽象程度高&#xff0c;离计算机硬件远&#xff0c;因此并没有被工业界广泛使用。然而在许多面…

掌握App用户注册情况,Xinstall来帮忙

在移动互联网时代&#xff0c;App已经成为企业与用户之间的重要桥梁。然而&#xff0c;对于许多App开发者来说&#xff0c;如何精准地获取和分析用户注册数据&#xff0c;一直是一个令人头疼的问题。幸运的是&#xff0c;有了Xinstall这样的一站式App全渠道统计服务商&#xff…

java八股文知识点讲解(个人认为讲的比较好的)

1、解决哈希冲突——链地址法&#xff1a;【第7章查找】19哈希表的查找_链地址法解决哈希冲突_哔哩哔哩_bilibili 2、解决哈希冲突——开放地址法 &#xff1a; 【第7章查找】18哈希表的查找_开放定址法解决哈希冲突_哔哩哔哩_bilibili 3、小根堆大根堆的创建&#xff1a;选择…

Ubuntu 忘记系统密码 如何修改密码

如果你忘记了Ubuntu系统的密码&#xff0c;你可以通过以下方法来修改密码&#xff1a; 通过GRUB引导菜单进入恢复模式 重启系统并进入GRUB引导菜单&#xff1a; 重启Ubuntu系统&#xff0c;并在启动时连续按Shift键&#xff08;或根据系统提示的其他按键&#xff09;&#xf…

Smart - Luogu —— 智能的洛谷

文章目录 安装 Stylus谷歌Edge 安装 Smart - Luogu使用尾声 安装 Stylus link 点击推荐下载&#xff0c;获取 crx 文件 谷歌 先点击右上角三个点&#xff0c;再点击扩展程序&#xff0c;然后点击管理扩展程序&#xff0c;进入管理扩展界面&#xff0c;把开发者模式选上&…

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL、SQL-PaLM)、新一代数据集BIRD-SQL解读

NL2SQL进阶系列(5)&#xff1a;论文解读业界前沿方案&#xff08;DIN-SQL、C3-SQL、DAIL-SQL&#xff09;、新一代数据集BIRD-SQL解读 NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2…

【C++进阶】详解C++类型转换IO流

C类型转换及IO流 一&#xff0c;C语言的类型转换方式二&#xff0c;C的四种强制类型转换方式2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic_cast 三&#xff0c;C语言的输入和输出四&#xff0c;C的标准IO流五&#xff0c;C文件IO流总结 这一节我们来讲解 C的…

数据结构OJ:设计循环队列

题目介绍 本题为LeetCode上的经典题目&#xff0c;题目要求我们设计一种循环队列&#xff0c;满足FIFO原则且队尾被连接在队首之后。 思路讲解 题目中介绍循环队列的好处是可以重复利用空间&#xff0c;所以我们很容易想到在初始化时即开辟指定大小的空间&#xff0c;之后便不…

策略模式:灵活调整算法的设计精髓

在软件开发中&#xff0c;策略模式是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。通过定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;策略模式使得算法可以互换使用&#xff0c;这使得算法可以独立于使用它们的客户。本文将详细介绍策略模式的…

【小贪】大数据处理常用:Pyspark, Pandas

近期致力于总结科研或者工作中用到的主要技术栈&#xff0c;从技术原理到常用语法&#xff0c;这次查缺补漏当作我的小百科。主要技术包括&#xff1a; ✅数据库常用&#xff1a;MySQL, Hive SQL, Spark SQL✅大数据处理常用&#xff1a;Pyspark, Pandas⚪ 图像处理常用&#…

【每日刷题】Day16

【每日刷题】Day16 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 160. 相交链表 - 力扣&…

基于小程序实现的4s店管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

【C++11】智能指针

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解在C11中智能指针&#xff0c;自己能模拟实现 4 种智能指针 > 毒鸡汤&#xff1a;白日莫闲过&#xff0c;青春不再来。 > 专栏选自&#xff1…

【halcon】C# halcon 内存暴增 续,找到一个解决方案

这里写自定义目录标题 背景释放临时缓存具体的使用感受背景 在之前的文章《【halcon】C# halcon 内存暴增 》中我们提到了一些会导致内存暴增的原因。 其中一个就是使用了计算复杂的算子,且图片很大时,此时内存就会暴增,而且内存无法被释放。 这次,我在做一个项目时,用到…

深入理解负载均衡:原理及常用算法

摘要&#xff1a; 负载均衡在现代网络架构中扮演着至关重要的角色&#xff0c;它通过分配请求到多个服务器来提高系统的性能、可用性和可伸缩性。本文将介绍负载均衡的基本原理以及常用的负载均衡算法&#xff0c;帮助读者更好地理解和应用负载均衡技术。 引言 随着互联网的迅…

TP5使用group报错:1055 Expression #1 of SELECT list is not in GROUP

使用group报错 Mysql环境是5.7的, 使用了View进行了表连接, 进行了表连接 搬迁到本地后, 查询报错 Syntax error or access violation: 1055 Expression 解决方法1 配置 my.cnf(linux)文件 win下面是 mysql.ini文件 在 mysqld 里加上 sql_modeNO_ENGINE_SUBSTITUTION,STR…

L2-3 完全二叉树的层序遍历

完全二叉树的层序遍历 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点&#xff0c;这样的树就是完全…

网络爬虫:定义、应用及法律道德考量

网络爬虫技术在当今数据驱动的世界中发挥着重要作用。本文将从网络爬虫的定义和主要功能&#xff0c;其在业界的应用实例&#xff0c;以及涉及的法律和道德问题三个方面进行深入探讨。 1. 爬虫的定义和主要功能 网络爬虫&#xff0c;也称为网页爬虫或蜘蛛&#xff0c;是一种…