两个队列实现一个栈-----队列面试题3
问题
使用两个队列实现一个栈
这是 两个栈实现一个队列的孪生问题,对该问题解法不清楚的可以移步
两个栈实现一个队列—–队列面试题2
使用两个队列实现一个栈比其他的孪生问题来说,能复杂一些
思路
- 设置一个队列为 queue1, 另一个为 queue2
- 入栈时,将元素入队列非空队列
- 出栈时,将非空队列的前 n-1 个元素出队列到另一个空队列中,然后出栈元素就是此时非空队列剩下的最后一个元素,出队列它即可
- 获取栈顶元素与出栈同理
方法实现
在求解过程中,我们将使用顺序表实现的队列作为载体,所以对顺序表实现的队列和基本操作不清楚的可以移步
队列(顺序表实现)概念及相关函数
stackby2queue.h
#pragma once
#include "seqqueue.h"typedef struct StackBy2 {SeqQueue queue1;SeqQueue queue2;
}StackBy2;// 出栈
void StackBy2Pop(StackBy2* stack);// 入栈
void StackBy2Push(StackBy2* stack, Datatype value);// 获取栈顶元素
int StackBy2Top(StackBy2* stack, Datatype* value);
stackby2queue.c
内含单元测试函数,可以通过条件编译将测试模块关闭
#include "stackby2queue.h"// 初始化队列
void SeqQueueInit(SeqQueue* queue) {// 非法输入if(queue == NULL) {perror("Init");return;}queue->head = queue->tail = 0;queue->size = 0;
}// 销毁队列
void SeqQueueDestroy(SeqQueue* queue) {// 非法输入if(queue == NULL) {perror("Destroy");return;}queue->tail = queue->head = queue->size = 0;
}// 入队列,尾插
int SeqQueuePush(SeqQueue* queue, Datatype value) {// 非法输入if(queue == NULL) {perror("Push");return;}// 1. 队列未满if(queue->size < MAX_SIZE-1) {// a. 已达到数组最后一个元素,从数组头开始存储if(queue->tail == MAX_SIZE-1) {queue->tail = 0;queue->data[queue->tail++] = value;queue->size++;}else {// b. 未达到,继续向后存储queue->data[queue->tail++] = value;queue->size++;}}else {// 2. 队列满// a. 尾插失败return 0;}return 1;
}// 出队列,头删
int SeqQueuePop(SeqQueue* queue) {// 非法输入if(queue == NULL) {perror("Pop");return 0;}// 空队列if(queue->size == 0) {return 0;}if(queue->head == MAX_SIZE-1) {queue->head = 0;}else {queue->head++;queue->size--;}return 1;
}// 取队首元素
int SeqQueueTop(SeqQueue* queue, Datatype* value) {// 非法输入if(queue==NULL || value==NULL) {perror("Top");return 0;}// 空队列if(queue->size == 0) {return 0;}*value = queue->data[queue->tail-1];return 1;
}/* ************************************************* ******************** test*********************** ***********************************************/#if 0
#include <stdio.h>#define FUNCTION() printf("\n================ %s ===============\n", __FUNCTION__)// 队列打印
void print(SeqQueue queue, const char* msg) {printf("\n%s\n", msg);int i = 0 ;int index = queue.head;printf("head = %d, 队首:>\n", i);for( ; i < queue.size; i++) {if(index == MAX_SIZE) {index = 0;} printf("%c\n", queue.data[index]);index++;}
}// 入队列测试
void TestPush() {FUNCTION();SeqQueue queue;SeqQueueInit(&queue);SeqQueuePush(&queue, 'a');SeqQueuePush(&queue, 'b');SeqQueuePush(&queue, 'c');SeqQueuePush(&queue, 'd');print(queue, "入队列1,2,3,4");
}// 出队列测试
void TestPop() {FUNCTION();SeqQueue queue;SeqQueueInit(&queue); SeqQueuePush(&queue, 'a');SeqQueuePush(&queue, 'b');SeqQueuePush(&queue, 'c');SeqQueuePush(&queue, 'd');print(queue, "队列初始化");int ret = SeqQueuePop(&queue);SeqQueuePop(&queue);print(queue, "出队列两个");SeqQueuePop(&queue);print(queue, "出队列一个");SeqQueuePop(&queue);print(queue, "出队列一个");SeqQueuePop(&queue);print(queue, "空队列出队列");
}// 取栈顶元素测试
void TestTop() {FUNCTION();SeqQueue queue;SeqQueueInit(&queue); SeqQueuePush(&queue, 'a');SeqQueuePush(&queue, 'b');SeqQueuePush(&queue, 'c');SeqQueuePush(&queue, 'd');print(queue, "队列初始化");Datatype value;SeqQueueTop(&queue, &value);printf("top is %c\n", value);// 销毁队列SeqQueueDestroy(&queue);print(queue, "销毁队列");
}int main() {TestPush();TestPop();TestTop();return;
}
#endif
两个队列实现一个栈-----队列面试题3相关推荐
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- java实现-两个栈实现一个队列和两个队列实现一个栈
1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...
- python ——两个队列实现一个栈两个栈实现一个队列
1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...
- 两个栈实现一个队列与两个队列实现一个栈
http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...
- 两个栈实现一个队列/两个队列实现一个栈
http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...
- 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...
- C/C++面试题—使用STL两个队列实现一个栈
题目介绍 使用STL中的两个队列实现一个栈,实现栈的top.pop.push.clear等操作. 思路分析 思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断q ...
- java 栈和队列实现迷宫代码_使用两个队列实现一个栈
两个队列实现一个栈 栈的特点是后进先出,队列的特点是先进先出.使用两个队列模拟栈,实现栈的push,pop,top,empty 操作. 假设队列中均为数字,其中队列q1为操作队列,q2为辅助队列. p ...
- 【c语言】两个队列实现一个栈
两个队列实现一个栈 核心思想:模拟出栈的后进先出操作 创建queue1和queue2,入栈时选择一个非空队列执行入队列操作(若两个队列都为空,则随机选择一个队列),出栈时需要先从非空队列queue1把 ...
- 【C++】两个队列实现一个栈
两个队列实现一个栈的思想:用_PushQ1队列作为push数据的队列,用_TmpQ2队列暂存数据 1.只要是对栈进行push操作,就将数据push入_PushQ1队列中. 2.要实现栈的pop操作,就 ...
最新文章
- 杂七杂八的前端基础01——函数作用域
- hashmap的五种便利方式
- Py之imblearn:imblearn/imbalanced-learn库的简介、安装、使用方法之详细攻略
- vue 同时执行两个函数 点击_【第2112期】 import { reactive } from #39;vue#39;
- selenium+linux+python,Linux下Python+selenium自动化环境搭建
- php7.3 mysql gd支持_配置PHP对gd库的支持
- vector容器动态申请内存的过程_记录一次自定义Allocator profile的过程
- 有关objc中的单例
- MVC4发布到IIS,出现HTTP 错误 404.0 - Not Found的解决方法
- 记Ubuntu20.04搭建jekyll博客+github环境踩坑-终结版
- mybatis中resultMap的几种用法
- java 原子类_没用过Java原子类?我来手写一个AtomicInteger
- 《图像处理、分析与机器视觉 第四版》 摄像机 相机概述——学习笔记
- Linux与网络服务(一)网络服务相关概念通俗解释(科普向)
- 怎么推广引流?利用B站短视频上热门技巧轻松吸粉
- Podman的基本设置和使用
- ABAP 将用户日期格式转换为无任何格式的日期
- python基础知识点集锦一
- 市值破7000亿美元 贝索斯成全球新首富,成就亚马逊的正是人工智能
- 工程伦理--15.6 克隆技术和干细胞研究的伦理问题(下)