s1和s2分别是两个栈,用两个栈实现一个队列的规则如下:

如何入队: 入队只向s1里面入队
如何出队: 看s2里面有没有值,有的话,直接出即可
           s2里面没有值,为空怎么办?
           将s1里面的值,全部颠倒存放到s2,这时候s2就不空了,则直接出即可

这里需要函数调函数,所以需要栈能够实现的相关函数,这里把链接如下,需要结合一起看。

(35条消息) 数据结构——栈(顺序栈)_张淑芬~的博客-CSDN博客

用两个栈模拟实现的队列的结构体设计:

//用两个栈模拟实现的队列的结构体
typedef struct Two_stack_queue
{struct Stack s1;//这里的Stack是顺序栈struct Stack s2;
}Two_stack_queue, * PTwo_stack_queue;

可执行函数声明:

//初始化
void my_Init_2stack_queue(struct Two_stack_queue* tsq);//入队
bool my_Push(PTwo_stack_queue tsq, ELEM_TYPE val);//出队(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Pop(PTwo_stack_queue tsq, ELEM_TYPE* rtval);//获取队头元素值(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Top(PTwo_stack_queue tsq, ELEM_TYPE* rtval);//判空
bool my_IsEmpty(PTwo_stack_queue tsq);//有效元素个数
int my_Get_length(PTwo_stack_queue tsq);//打印
void my_Show(PTwo_stack_queue tsq);//清空
void my_Clear(PTwo_stack_queue tsq);//销毁
void my_Destroy(PTwo_stack_queue tsq);

初始化;

//初始化
void my_Init_2stack_queue(struct Two_stack_queue* tsq)
{assert(tsq != NULL);Init_Stack(&tsq->s1);//直接调用s1和s2自身的初始化函数即可Init_Stack(&tsq->s2);
}

入队,出队

//入队
bool my_Push(PTwo_stack_queue tsq, ELEM_TYPE val)
{assert(tsq != NULL);return Push(&tsq->s1, val);//调用栈吱声的入队函数
}//出队(还需要一个输出参数,帮助我将出队的值带出来)
//从s2出,如果s2不空,直接出,
//如果s2空,先将s1的数据全部颠倒存放到s2里,这时s2就不空了
bool my_Pop(PTwo_stack_queue tsq, ELEM_TYPE* rtval)
{assert(tsq != NULL);if (my_IsEmpty(tsq))//证明模拟实现的队列里有数据,在哪不确定{return false;}if (IsEmpty(&tsq->s2))//确定了数据在s1里{ELEM_TYPE tmp;while (!IsEmpty(&tsq->s1))//只要s1里面还有值 就取出来放到s2里面{Pop(&tsq->s1, &tmp);Push(&tsq->s2, tmp);}return Pop(&tsq->s2, rtval);}else//如果s2不空 直接出值{return Pop(&tsq->s2, rtval);}
}

获取队头元素值(还需要一个输出参数,帮助我将出队的值带出来)

//获取队头元素值(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Top(PTwo_stack_queue tsq, ELEM_TYPE* rtval)
{assert(tsq != NULL);if (my_IsEmpty(tsq))//证明模拟实现的队列里有数据,在哪不确定{return false;}if (IsEmpty(&tsq->s2)){ELEM_TYPE tmp;while (!IsEmpty(&tsq->s1))//只要s1里面还有值 就取出来放到s2里面{Pop(&tsq->s1, &tmp);Push(&tsq->s2, tmp);}return Top(&tsq->s2, rtval);}else{return Top(&tsq->s2, rtval);}
}

判空,有效元素个数

//判空
bool my_IsEmpty(PTwo_stack_queue tsq)
{assert(tsq != NULL);if (IsEmpty(&tsq->s1) && IsEmpty(&tsq->s2)){return true;}return false;
}//有效元素个数
int my_Get_length(PTwo_stack_queue tsq)
{assert(tsq != NULL);return Get_length(&tsq->s1)+Get_length(&tsq->s2);
}

打印,清空,销毁

//打印
void my_Show(PTwo_stack_queue tsq)
{assert(tsq != NULL);//先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(PTwo_stack_queue tsq)
{assert(tsq != NULL);Clear(&tsq->s1);Clear(&tsq->s2);
}//销毁
void my_Destroy(PTwo_stack_queue tsq)
{assert(tsq != NULL);Destroy(&tsq->s1);Destroy(&tsq->s2);
}

如何用两个栈模拟实现一个队列相关推荐

  1. 用栈实现队列---用两个栈模拟实现一个队列

     入队列:直接将元素放进s1(s1栈顶为模拟队列的队尾); 出队列:如果s2非空,直接让s2出栈(s2栈顶为模拟队列的队头): 如果s2为空,将s1中所有元素导入s2中,然后让s2出栈. 获取队头元素 ...

  2. 《剑指offer》c++版本 9. 用两个栈来实现一个队列

    如题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 本题考察对数据结构队列,栈的理解.队列的特点是FIFO,先进先出.栈的特点是FILO,先进后出.题目要求我 ...

  3. 牛客网(剑指offer) 第五题 用两个栈来实现一个队列

    //用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. //方法一:没有用到栈 $queue=array(); function mypush($node) {glo ...

  4. 化栈为队(两个栈来实现一个队列)

    实现一个MyQueue类,该类用两个栈来实现一个队列. 示例: MyQueue queue = new MyQueue();queue.push(1); queue.push(2); queue.pe ...

  5. JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)

    最近在刷<剑指offer>里的编程题,但是网上关于<剑指offer>的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码 ...

  6. N5-用两个栈来实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; /*** 用两个栈来实现一个队列,完成队列的Push和P ...

  7. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution {      ...

  8. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  9. 剑指offer两个栈来实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 一个水题,不过有一个坑:我们假设stack1是输入用的,stack2是输出用的,必须是stack2 ...

  10. 两个栈来实现一个队列的C++代码(某公司社会招聘笔试题)

    利用两个栈来实现一个队列, 这个问题很常见.  最关键的是要有好的思路, 至于实现, 那是很简单的事情了. 在本文中, 也想说说自己的思路, 但是, 我觉得用代码来表述思路更符合我的习惯, 也是我的菜 ...

最新文章

  1. 基于用户投票的排名算法(一):Delicious和Hacker
  2. Android MTK平台最完备的开机动画修改教程
  3. smartform 中currency 字段的小数点问题
  4. PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较
  5. 最近微信方面的更新   getUserInfo:fail scope unauthorized
  6. JavaFX列表示例
  7. PHP语言 -- 发起流程
  8. 英特尔发布全新英特尔® INDE 2015工具套件
  9. 手机自动化测试:Appium源码分析之跟踪代码分析七
  10. 惠普台式电脑重装系统仍然启动不了,怎么办
  11. 1041: 谭浩强C语言(第三版)习题5.5
  12. 省市区三级联动(拼接写法)
  13. win10 同时多用户远程桌面连接-RDPWrap-v1.6.2-support-21H2-19044.1949
  14. (*(volatile unsigned int *))详解
  15. 淘宝网店如何提升无线端宝贝权重,抢占更多无线流量?
  16. idea IntelliJ IDEA 2018.2.5 x64 破解
  17. 地理计算 | EXCEL中快速计算列表的经纬度距离
  18. unity ShaderLab 基础之【像素混合Blend】Blend命令详解 shaderLab blend blendOp透明度颜色混合
  19. C# 改变DataGridView标题行的边框颜色
  20. 计算机设备的名称,计算机设备名称词汇

热门文章

  1. 广东省8月份同城快递和上门签收分析-你的签收率是多少?
  2. Visual Studio - 安装VAX
  3. SPSS新手教程——通过探索性分析,检验数据的正态性分布
  4. 常见 MIME 类型列表
  5. Cisco 路由器破解密码
  6. 什么叫误差的反向传播,反向传播误差怎么算的
  7. 【图像处理】色彩空间 YUV 420 SP / YUV 420 P 含义 RGB转换 YUV 黑色怎么表示
  8. mega软件 linux,Linux系统下使用MegaCli软件对磁盘阵列进行操作
  9. vue2.0网易云音乐播放器 (实时更新)
  10. ROON1.8无法找到asio驱动的解决办法