使用两个栈实现一个队列

使用两个栈实现一个队列题目 使用两个栈实现一个队列 栈 后进先出 队列 先进先出 入队列 直接入栈 1 出队列 返回队列的队尾元素 返回队列的队头元素 队列为空 栈 1 为空 amp amp amp amp amp amp amp amp amp amp 栈 2 为空 队列元素个数 栈 1 的元素个数 栈 2 的元素个数 参考代码 设置一个队列由两个栈组成 typedefstruc


栈:后进先出。
队列:先进先出。





入队列:
  直接入栈1。
出队列:
这里写图片描述
返回队列的队尾元素:
这里写图片描述
返回队列的队头元素:
这里写图片描述
队列为空:
  栈1为空&&栈2为空。
队列元素个数:
  栈1的元素个数+栈2的元素个数。























参考代码:

设置一个队列由两个栈组成:






typedef struct Queue { stack s1; stack s2; }queue;

  其中栈:

#define Max 10 #define Datatype int typedef struct stack { Datatype data[Max]; int top ; }stack;

队列的初始化:
  队列的初始化即两个栈的初始化

void InitQueue(queue *q) { assert(q); InitStack(&q->s1); InitStack(&q->s2); }

  栈的初始化:

 void InitStack(stack *s) { assert(s); s->top = 0; memset(s->data, 0, Max*sizeof(Datatype)); }

入队列:
  直接入栈1

void PushQueue(queue *q, Datatype d) { assert(q); //入栈1 PushStack(&q->s1, d); }

  入栈:

void PushStack(stack *s, Datatype d) { assert(s); if (s->top >= Max) { printf("队列已满!\n"); return; } s->data[s->top++] = d; }

出队列:
  栈2不为空即栈2出栈,若栈2为空,将栈1的元素导入栈2,栈2出栈。

void PopQueue(queue *q) { assert(q); if (EmptyQueue(q)) { printf("队列为空!\n"); return; } //如果栈2为空,将栈1中的元素移入栈2 if (EmptyStack(&q->s2)) { while (!EmptyStack(&q->s1)) { PushStack(&q->s2, TopStack(&q->s1)); PopStack(&q->s1); } } //栈2的栈顶 PopStack(&q->s2); }

  出栈:

 void PopStack(stack *s) { assert(s); if (s->top == 0) return; s->top--; }

  返回栈顶元素:

Datatype TopStack(stack *s) { assert(s); return s->data[s->top - 1]; }

返回队尾元素:
  即栈1的栈顶元素,若栈1为空,将栈2的元素移入栈1,栈1栈顶出栈。

//栈1的栈顶 Datatype QueueBack(queue *q) { assert(q); if (EmptyQueue(q)) { printf("队列为空!\n"); return -1; } //如果栈1为空,将栈2中的元素移入栈1 if (EmptyStack(&q->s1)) { while (!EmptyStack(&q->s2)) { PushStack(&q->s1, TopStack(&q->s2)); PopStack(&q->s2); } } //栈1的栈顶 return TopStack(&q->s1); }

返回队头元素:
即栈2的栈顶元素,若栈2为空,将栈1的元素移入栈2,返回栈2的栈顶。

//栈2的栈顶 Datatype QueueFront(queue *q) { assert(q); if (EmptyQueue(q)) { printf("队列为空!\n"); return -1; } //如果栈2为空,将栈2中的元素移入栈1 if (EmptyStack(&q->s2)) { while (!EmptyStack(&q->s1)) { PushStack(&q->s2, TopStack(&q->s1)); PopStack(&q->s1); } } //栈2的栈顶 return TopStack(&q->s2); }

判断队列是否为空:
  队列为空即两个栈均为空。

//栈1为空&&栈2为空 int EmptyQueue(queue *q) { assert(q); return EmptyStack(&q->s1) && EmptyStack(&q->s2); }

  栈是否为空:(判断top是否等于0)

int EmptyStack(stack *s) { assert(s); return 0 == s->top; }

队列元素个数:
  栈1的元素个数加栈2的元素个数。

//栈1元素个数+栈2元素个数 int SizeQueue(queue *q) { assert(q); return SizeStack(&q->s1) + SizeStack(&q->s2); }

  栈元素的个数:

int SizeStack(stack *s) { assert(s); return s->top; }

 整体代码: 

.h文件

#include 
               #include 
               #include 
               #include 
               #define Max 10 #define Datatype int typedef struct stack { Datatype data[Max]; int top ; }stack; typedef struct Queue { stack s1; stack s2; }queue; //初始化对列 void InitQueue(queue *q); //入对列 void PushQueue(queue *q, Datatype d); //对列元素个数 int SizeQueue(queue *q); //对列尾 int QueueBack(queue *q); //对列尾 int QueueFront(queue *q); //出对列 void PopQueue(queue *q);

.c文件

#include"TwoStack_Queeue.h" //1.初始化栈 void InitStack(stack *s) { assert(s); s->top = 0; memset(s->data, 0, Max*sizeof(Datatype)); } //1.初始化队列 void InitQueue(queue *q) { assert(q); InitStack(&q->s1); InitStack(&q->s2); } //入栈1 void PushStack(stack *s, Datatype d) { assert(s); if (s->top >= Max) { printf("队列已满!\n"); return; } s->data[s->top++] = d; } //入队列(入栈1) void PushQueue(queue *q, Datatype d) { assert(q); //入栈1 PushStack(&q->s1, d); } //栈元素个数 int SizeStack(stack *s) { assert(s); return s->top; } //队列元素个数 int SizeQueue(queue *q) { assert(q); return SizeStack(&q->s1) + SizeStack(&q->s2); } //栈空 int EmptyStack(stack *s) { assert(s); return 0 == s->top; } //队列空 int EmptyQueue(queue *q) { assert(q); return EmptyStack(&q->s1) && EmptyStack(&q->s2); } //出栈 void PopStack(stack *s) { assert(s); if (s->top == 0) return; s->top--; } //返回栈顶元素 Datatype TopStack(stack *s) { assert(s); return s->data[s->top - 1]; } //出队列 void PopQueue(queue *q) { assert(q); if (EmptyQueue(q)) { printf("队列为空!\n"); return; } //如果栈2为空,将栈1中的元素移入栈2 if (EmptyStack(&q->s2)) { while (!EmptyStack(&q->s1)) { PushStack(&q->s2, TopStack(&q->s1)); PopStack(&q->s1); } } //栈2的栈顶 PopStack(&q->s2); } //队列尾 栈1的栈顶 Datatype QueueBack(queue *q) { assert(q); if (EmptyQueue(q)) { printf("队列为空!\n"); return -1; } //如果栈1为空,将栈2中的元素移入栈1 if (EmptyStack(&q->s1)) { while (!EmptyStack(&q->s2)) { PushStack(&q->s1, TopStack(&q->s2)); PopStack(&q->s2); } } //栈1的栈顶 return TopStack(&q->s1); } //队列头 栈2的栈顶 Datatype QueueFront(queue *q) { assert(q); if (EmptyQueue(q)) { printf("队列为空!\n"); return -1; } //如果栈1为空,将栈2中的元素移入栈1 if (EmptyStack(&q->s2)) { while (!EmptyStack(&q->s1)) { PushStack(&q->s2, TopStack(&q->s1)); PopStack(&q->s1); } } //栈2的栈顶 return TopStack(&q->s2); }

测试文件:

#include"TwoStack_Queeue.h" void Test2StackToQueue() { queue q; InitQueue(&q); PushQueue(&q, 1); PushQueue(&q, 2); PushQueue(&q, 3); PushQueue(&q, 4); PushQueue(&q, 5); printf("%d\n", SizeQueue(&q)); printf("队尾 = %d\n", QueueBack(&q)); printf("队头 = %d\n", QueueFront(&q)); PopQueue(&q); PushQueue(&q, 5); PushQueue(&q, 6); printf("%d\n", SizeQueue(&q)); printf("队尾 = %d\n", QueueBack(&q)); printf("队头 = %d\n", QueueFront(&q)); } int main() { Test2StackToQueue(); system("pause"); return 0; }

这里写图片描述
运行结果:
这里写图片描述




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205995.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午4:42
下一篇 2026年3月19日 下午4:43


相关推荐

  • linux 查看java的pid,linux 查看java进程pid「建议收藏」

    linux 查看java的pid,linux 查看java进程pid「建议收藏」linux查看java进程pid[2021-01-3021:05:24]简介:建站服务器这篇文章主要介绍了linux中如何查看系统进程,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下linux查看端口被哪个进程占用的方法:1、使用“lsof-i:端口号”来查看;2、使用“netstat-tunlp|grep端口号”来查看。linux查看端口被哪个进程占…

    2022年8月24日
    11
  • 【Redis】笔记(尚硅谷、黑马整合)

    【Redis】笔记(尚硅谷、黑马整合)笔记内容包括两个视频的笔记 Redis 尚硅谷 java 研究院 推荐 Redis 入门到精通 黑马程序员 https www bilibili com video BV1CJ411m7Gc 第 1 章 NoSQL 简介 REmoteDictio 是一种用 C 语言开发的开源的高性能键值对数据库 1 1 技术的分类解决功能性的问题 Java Servlet Jsp Tom

    2026年3月18日
    2
  • Hive Hsql 常用命令「建议收藏」

    Hive Hsql 常用命令「建议收藏」简介Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计。以下介绍常用的Hive的类SQL语句。创建表:hive>createtabletablename(idint,namestri…

    2026年2月15日
    7
  • flex弹性盒子布局(详细)

    flex弹性盒子布局(详细)弹性盒模型 1 伸缩容器 displayFlex 是 FlexibleBox 的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为 Flex 布局 采用 Flex 布局的元素 称为 Flex 容器 flexcontaine 简称 容器 它的所有子元素自动成为容器成员 称为 Flex 项目 flexitem 简称 项目 容器默认存在两根轴 水平的主轴 mainaxis 和垂直的交叉轴 crossaxis 主轴的开始位置 与边框的交叉点 叫做 m

    2026年3月17日
    2
  • CSS之经典flex布局-垂直居中「建议收藏」

    CSS之经典flex布局-垂直居中「建议收藏」<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metahttp-equiv=”X-UA-Compatible”content=”IE=edge”><metaname=”viewport”content=”width=device-width,initial-scale=1.0″><title>flex垂直居中&lt

    2022年6月3日
    35
  • 眼图测试分析

    眼图测试分析眼图测试分析 转载原网址 http m elecfans com article 662764 htm 原网址 http m elecfans com article 662764 htm 波形参数测试是数字信号质量评估最常用的测量方法 但是随着数字信号速率的提高 仅仅靠幅度 上升时间等的波形参数的测量方法越来越不适用了 比如下图的一个 5Gbps 的信号来说 由于受到传输通道的损耗的影响

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号