如何用两个栈实现一个队列?
Two stack to queue规则:(重点就是理解规则)
如何入队:入队只向s1里面入队(默认s1是可以无限存放的)
如何出队:看s2里面有没有值,有的话直接出;如果s2为空怎么办?将s1里面的值,全部颠倒存放到s2中,这时s2就不空了,则直接出即可。
两个栈实现一个队列:这个很简单里边的很多函数都是可以直接调用我们上一节写过的顺序栈中的函数。(栈(顺序栈) - 基础数据_hi332516_1的博客-CSDN博客)
先写头文件two_stack_to_queue.h
#pragma once
#include"Stack.h"
typedef int ELEM_TYPE;//用两个栈实现的队列的结构体
typedef struct Two_stack_queue
{struct Stack s1;//是之前自己实现过的顺序栈struct Stack s2;
}Two_stack_queue, * PTwo_stack_queue;//初始化
void my_Init_2stack_queue(struct Two_stack_queue* tsq);//入队
bool my_Push(struct Two_stack_queue* tsq, ELEM_TYPE val);//出队(还需要一个输出参数,帮助将出队的值带出来)
bool my_Pop(struct Two_stack_queue* tsq, ELEM_TYPE* rtval);//获取队头元素值(还需要一个输出参数,帮助将出队的值带出来)
bool my_Top(struct Two_stack_queue* tsq, ELEM_TYPE* rtval);//判空
bool my_IsEmpty(struct Two_stack_queue* tsq);//有效元素个数
int my_Get_length(struct Two_stack_queue* tsq);//打印
void my_Show(struct Two_stack_queue* tsq);//清空
void my_Clear(struct Two_stack_queue* tsq);//销毁
void my_Destroy(struct Two_stack_queue* tsq);
再写two_stack_to_queue.cpp文件(里边有很多内容都是直接调用的顺序栈的内容)为什么每一个前边都加了my,这是为了和顺序栈的函数声明作以区分。
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<stdlib.h>
#include"Stack.h"
#include"two_stack_to_queue.h"//初始化
void my_Init_2stack_queue(struct Two_stack_queue* tsq)
{Init_stack(&tsq->s1);//直接调用s1和s2自身的初始化函数即可Init_stack(&tsq->s2);
}//入队
bool my_Push(struct Two_stack_queue* tsq, ELEM_TYPE val)
{return Push(&tsq->s1, val);//直接调用s1和s2自身的入栈函数即可
}//出队(还需要一个输出参数,帮助将出队的值带出来)
//从s2出,如果s2不空,直接出
//如果s2为空,先将s1的数据全部颠倒到s2中
bool my_Pop(struct Two_stack_queue* tsq, ELEM_TYPE* rtval)
{//assertif (my_IsEmpty(tsq))//证明模拟实现的队列里有数据,在哪不确定{return false;}if (IsEmpty(&tsq->s2))//确定了数据在s1中{ELEM_TYPE tmp;while (!IsEmpty(&tsq->s1))//只要s1里边还有值就取出来放在s2中{Pop(&tsq->s1, &tmp);//直接调用s1和s2自身的入栈函数即可Push(&tsq->s2, tmp);}return Pop(&tsq->s2, rtval);}else//如果s2有值,直接出{return Pop(&tsq->s2, rtval);}
}//获取队头元素值(还需要一个输出参数,帮助将出队的值带出来)
bool my_Top(struct Two_stack_queue* tsq, ELEM_TYPE* rtval)
{//assertif (my_IsEmpty(tsq))//证明模拟实现的队列里有数据,在哪不确定{return false;}if (IsEmpty(&tsq->s2))//确定了数据在s1中{ELEM_TYPE tmp;while (!IsEmpty(&tsq->s1))//只要s1里边还有值就取出来放在s2中{Pop(&tsq->s1, &tmp);//直接调用s1和s2自身的入栈函数即可Push(&tsq->s2, tmp);}return Top(&tsq->s2, rtval);}else//如果s2有值,直接出{return Top(&tsq->s2, rtval);}
}//判空
bool my_IsEmpty(struct Two_stack_queue* tsq)
{if (IsEmpty(&tsq->s1) && IsEmpty(&tsq->s2)){return false;}}//有效元素个数
int my_Get_length(struct Two_stack_queue* tsq)
{return Get_length(&tsq->s1) + Get_length(&tsq->s2);
}//打印
void my_Show(struct Two_stack_queue* tsq)
{//先s2,再s1//s2从上到下打印,s1从下到上打印int len = Get_length(&tsq->s2);for (int i = len - 1; i >= 0 ;i-- ){printf("%d ", tsq->s2.base[i]);}Show(&tsq->s1);
}//清空
void my_Clear(struct Two_stack_queue* tsq)
{Clear(&tsq->s1);Clear(&tsq->s2);
}//销毁
void my_Destroy(struct Two_stack_queue* tsq)
{Destroy(&tsq->s1);Destroy(&tsq->s2);
}
最后在主函数中测试代码的正确性
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#include<assert.h>
#include<vld.h>
#include"two_stack_to_queue.h"//两个栈模拟实现一个队列的测试用例
int main()
{struct Two_stack_queue head;my_Init_2stack_queue(&head);for (int i = 1; i <= 3; i++){my_Push(&head, i);}my_Show(&head);ELEM_TYPE flag;bool tag = my_Pop(&head, &flag);if (tag){printf("Pop = %d\n", flag);}my_Show(&head);for (int i = 4; i <= 6; i++){my_Push(&head, i);}my_Show(&head);my_Pop(&head, &flag);printf("Pop = %d\n", flag);my_Pop(&head, &flag);printf("Pop = %d\n", flag);my_Pop(&head, &flag);printf("Pop = %d\n", flag);my_Pop(&head, &flag);printf("Pop = %d\n", flag);printf("length = %d\n", my_Get_length(&head));my_Top(&head, &flag);printf("Top = %d\n", flag);printf("length = %d\n", my_Get_length(&head));my_Destroy(&head);return 0;
}
测试结果
如何用两个栈实现一个队列?相关推荐
- 算法图解:如何用两个栈实现一个队列?
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 https://github.com/vipstone/algori ...
- java 栈和队列实现迷宫代码_算法图解:如何用两个栈实现一个队列?
本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 队列和栈是计算机中两个非常重要的数据结构,经过前面的学习(<队列> ...
- 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 【剑指offer】用两个栈实现一个队列
题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...
- 剑指offer五:两个栈实现一个队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- python 用两个栈实现一个队列
| 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...
- java实现-两个栈实现一个队列和两个队列实现一个栈
1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...
- python ——两个队列实现一个栈两个栈实现一个队列
1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...
最新文章
- 利用Procdump+Mimikatz获取Windows帐户密码
- Selenium3自动化测试——19.读取数据文件
- 安装开源项目 MultiType (基于 RecyclerView)出现的各种问题 -- 自己的第一篇博客...
- 统计字符串中单词个数
- it招聘的一些门道与招聘数据分析(持续更新)
- .netcore下的微服务、容器、运维、自动化发布
- web字体设置成平方字体_如何托管自己的Web字体
- 当当网回应李国庆“夺权”;小米:为常程不当言论道歉;Rust 1.43.0 发布 | 极客头条...
- php读取url连接的图片,输出到浏览器
- 导入别的项目到我的eclipse上出现红色感叹号问题
- 堆溢出-unlink
- 基于微信小程序的相关管理系统设计与实现开题报告的思路及方法
- 便宜SSL证书申请平台 证书获取方案
- 布道微服务_17服务调用失败的解决方案
- 机器学习工程师 — Udacity 电影评分的 k 均值聚类
- js解析json字符串为json对象,js解析json的6种方法
- MultipleOutputFormat和MultipleOutputs
- 为RGB图像增加alpha通道(RGB -> RGBA)
- linux java -cp 环境变量
- IRS:智能反射表面(可重构智能表面)
热门文章
- 单线程模型中Message、Handler、Message Queue、Looper之间的关系
- vax与vay的区别
- sam音高修正_Melodyneplugin音高修正插件使用入门(精)
- Postman下载与安装操作步骤【超详细】
- 永洪bi_永洪BI_咨询服务_数据服务_云市场-华为云
- java 定时调用api_java定时任务接口ScheduledExecutorService
- 改写jtopo滚轮缩放代码
- 汇编语言浮点数指令集
- 吐槽一下:武装GoldenDict时,好一个OALD,RAR格式,12万多的文件,晕!!
- 【libuv】实现UDP转发