队列和栈的相互实现(二)
本篇文章来用两个栈来实现队列
目录
用栈实现队列
栈的编写
队列的实现分析
队列的定义及初始化
入队(入栈)
出队(出栈)
返回队头元素
判断队列是否为空和队列的销毁
做题链接: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);
}
队列和栈的相互实现(二)相关推荐
- LeetCode(集合)队列和栈的相互实现 golang
手写!!! 225. 用队列实现栈 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意 ...
- 数据结构-线性表之用队列实现栈用栈实现队列
文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...
- LeetCode Algorithm 225. 用队列实现栈
225. 用队列实现栈 Ideas 队列和栈的相互操作,需要特别理解栈和队列这两种数据结构的相同点和不同点. 栈:先进后出,队列:先进先出. 既然数据结构已经限定元素进出的顺序,那么单纯的用一个队列肯 ...
- 栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~
1.栈和队列的简单介绍 1.1 栈的简单介绍 栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈.在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现. Java ...
- c++数据结构中 顺序队列的队首队尾_用队列实现栈,用栈实现队列,听起来有点绕,都搞懂了就掌握了精髓
一.背景 栈和队列是数据结构中最常用到的两种结构,有非常广泛的运用,该篇文章将通过动画的手段,展示栈和队列相互实现的底层原理,让我们真正搞懂栈和队列的特性. 二.概念 2.1 栈 栈[Stack]:是 ...
- 算法训练Day11 | LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)
目录 LeetCode232.用栈实现队列 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode225. 用队列实现栈 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 ...
- leetcode-225 队列实现栈
使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 队列的特点:先入先出 栈的特点:后入先出 ...
- Linux内核--网络栈实现分析(二)--数据包的传递过程--转
转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...
- python中的队列和栈_python的队列和栈
(一)队列和栈的区别 1.队列: 队列是一种特殊的线性表.其两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端 ...
最新文章
- linux下运行js挖矿,利用 JavaScript 代码挖矿
- python turtle画椭圆-【python turtle如何画椭圆】
- wc 统计文件的行数
- FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
- .net core上 K8S(七).netcore程序的服务发现
- winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...
- lisp提取长方形坐标_语义SLAM | 深度学习用于特征提取 : SuperPoint(一)
- RabbitMQ学习笔记-RabbitMQ简介
- halcon学习之边缘检测
- python消息模块_python - psutil 系统信息模块
- Quartus II 12.1安装及破解
- 毕业论文中计算机代码重复吗,知网查重程序代码算重复吗?
- 服务器租用如何保证数据安全
- 在pc计算机vga是什么意思,电脑上的VGA线是什么样的?图片
- Some WSL system related access rights are not set correctly. This sometimes happens after waking the
- css定位(二)---css中粘性定位(sticky)---C3新增属性
- 西门子bop20显示电流_SIEMENS/西门子BOP20基本操作员面板使用方法说明
- (附源码)ssm航空客运订票系统 毕业设计 141612
- 常用Unity平台解释
- ps5和switch哪个好
热门文章
- 克里金插值(Kriging)在MATLAB中的实现【优化】
- sqlserver主要的环境变量
- 武汉大专计算机专业分数线,武汉专科大学有哪些?武汉专科大学排名及分数线...
- 我靠“读书笔记”闷声赚3万:那些你看不上的行业,往往最赚钱
- 变量命名及常用属性大全
- 1782. Travel
- Zabbix5.0版本 全网监控方案
- DP83867E SGMII接口调试经验
- java 查看gc 次数_使用Jstat监控gc情况
- php直播接口代码,网易云视频直播php版api