本篇文章来用两个栈来实现队列

目录

用栈实现队列

栈的编写

队列的实现分析

队列的定义及初始化

入队(入栈)

出队(出栈)

返回队头元素

判断队列是否为空和队列的销毁


做题链接:232. 用栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)


用栈实现队列

用两个后进先出的栈实现一个先进先出的队列。

入栈1 2 3 4 5

出栈1 2 3 4 5

栈的编写

栈有后进先出的性质,对栈顶进行操作即可,我们选用顺序表来进行栈的实现,前面已经实现过,我们直接上代码:

typedef int Datatype;typedef struct Stack
{Datatype* a;int top;   //栈顶位置int capacity;   //容量
}ST;void StackInit(ST* ps);void StackDestory(ST* ps);void StackPush(ST* ps,Datatype x);void StackPop(ST* ps);//判断栈是否为空
bool StackEmpty(ST* ps);//数据个数
int StackSize(ST* ps);//访问栈顶数据
Datatype StackTop(ST* ps);//初始化
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}//销毁
void StackDestory(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}void StackPush(ST* ps, Datatype x)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;ps->a = realloc(ps->a, newcapacity*sizeof(Datatype));if (ps->a == NULL){printf("realloc fail\n");exit(-1);}ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}void StackPop(ST* ps)
{assert(ps);assert(ps->top>0);ps->top--;
}//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);//if (ps->top > 0)//{//   return false;//}//else//{// return true;//}return ps->top == 0;
}//数据个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}//访问栈顶数据
Datatype StackTop(ST* ps)
{assert(ps);assert(ps->top>0);return ps->a[ps->top-1];
}

队列的实现分析

两个栈实现队列,用两个后进先出的栈实现一组数据的先进先出。

图解:

队列的定义及初始化

依旧是开辟空间,判断是否成功,然后初始化队列中的两个栈。

typedef struct {ST Pushs1;ST Pops2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));assert(obj);StackInit(&obj->Pushs1);StackInit(&obj->Pops2);return obj;
}

入队(入栈)

栈初始化,已经置空,直接入栈即可

void myQueuePush(MyQueue* obj, int x) {assert(obj);StackPush(&obj->Pushs1,x);
}

出队(出栈)

由图解分析得,先得进行一次数据得倒入,再出栈有数据的栈即可

先判断第二个栈是否为空栈,空栈才能进行倒入,在判断第一个栈是否有元素。

倒入一个栈顶元素进空栈,并出栈原栈的栈顶元素,循环进行,直到原栈为空

注意:要求pop时要返回对头元素,对头元素即是栈顶元素。

之后出栈栈顶元素即可。

int myQueuePop(MyQueue* obj) {assert(obj);//s2空时需要push进s1元素才能出if(StackEmpty(&obj->Pops2)){while(!StackEmpty(&obj->Pushs1)){StackPush(&obj->Pops2,StackTop(&obj->Pushs1));StackPop(&obj->Pushs1);}}int front=StackTop(&obj->Pops2);StackPop(&obj->Pops2);return front;
}

返回队头元素

队头元素是倒入一次数据后非空栈的栈顶元素

进行一次判断倒入后,直接返回即可。

int myQueuePeek(MyQueue* obj) {assert(obj);if(StackEmpty(&obj->Pops2)){while(!StackEmpty(&obj->Pushs1)){StackPush(&obj->Pops2,StackTop(&obj->Pushs1));StackPop(&obj->Pushs1);}}return StackTop(&obj->Pops2);
}

判断队列是否为空和队列的销毁

队列里面还有两个栈,两个栈为空队列才为空,直接return即可。

销毁时先销毁两个栈,再销毁队列,防止内存泄漏。

bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->Pushs1)&&StackEmpty(&obj->Pops2);
}void myQueueFree(MyQueue* obj) {StackDestory(&obj->Pushs1);StackDestory(&obj->Pops2);free(obj);
}

队列和栈的相互实现(二)相关推荐

  1. LeetCode(集合)队列和栈的相互实现 golang

    手写!!! 225. 用队列实现栈 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意 ...

  2. 数据结构-线性表之用队列实现栈用栈实现队列

    文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...

  3. LeetCode Algorithm 225. 用队列实现栈

    225. 用队列实现栈 Ideas 队列和栈的相互操作,需要特别理解栈和队列这两种数据结构的相同点和不同点. 栈:先进后出,队列:先进先出. 既然数据结构已经限定元素进出的顺序,那么单纯的用一个队列肯 ...

  4. 栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~

    1.栈和队列的简单介绍 1.1 栈的简单介绍 栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈.在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现. Java ...

  5. c++数据结构中 顺序队列的队首队尾_用队列实现栈,用栈实现队列,听起来有点绕,都搞懂了就掌握了精髓

    一.背景 栈和队列是数据结构中最常用到的两种结构,有非常广泛的运用,该篇文章将通过动画的手段,展示栈和队列相互实现的底层原理,让我们真正搞懂栈和队列的特性. 二.概念 2.1 栈 栈[Stack]:是 ...

  6. 算法训练Day11 | LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    目录 LeetCode232.用栈实现队列 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode225. 用队列实现栈 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 ...

  7. leetcode-225 队列实现栈

    使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 队列的特点:先入先出 栈的特点:后入先出 ...

  8. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...

  9. python中的队列和栈_python的队列和栈

    (一)队列和栈的区别 1.队列: 队列是一种特殊的线性表.其两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端 ...

最新文章

  1. linux下运行js挖矿,利用 JavaScript 代码挖矿
  2. python turtle画椭圆-【python turtle如何画椭圆】
  3. wc 统计文件的行数
  4. FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
  5. .net core上 K8S(七).netcore程序的服务发现
  6. winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...
  7. lisp提取长方形坐标_语义SLAM | 深度学习用于特征提取 : SuperPoint(一)
  8. RabbitMQ学习笔记-RabbitMQ简介
  9. halcon学习之边缘检测
  10. python消息模块_python - psutil 系统信息模块
  11. Quartus II 12.1安装及破解
  12. 毕业论文中计算机代码重复吗,知网查重程序代码算重复吗?
  13. 服务器租用如何保证数据安全
  14. 在pc计算机vga是什么意思,电脑上的VGA线是什么样的?图片
  15. Some WSL system related access rights are not set correctly. This sometimes happens after waking the
  16. css定位(二)---css中粘性定位(sticky)---C3新增属性
  17. 西门子bop20显示电流_SIEMENS/西门子BOP20基本操作员面板使用方法说明
  18. (附源码)ssm航空客运订票系统 毕业设计 141612
  19. 常用Unity平台解释
  20. ps5和switch哪个好

热门文章

  1. 克里金插值(Kriging)在MATLAB中的实现【优化】
  2. sqlserver主要的环境变量
  3. 武汉大专计算机专业分数线,武汉专科大学有哪些?武汉专科大学排名及分数线...
  4. 我靠“读书笔记”闷声赚3万:那些你看不上的行业,往往最赚钱
  5. 变量命名及常用属性大全
  6. 1782. Travel
  7. Zabbix5.0版本 全网监控方案
  8. DP83867E SGMII接口调试经验
  9. java 查看gc 次数_使用Jstat监控gc情况
  10. php直播接口代码,网易云视频直播php版api