问题描述:

考虑用两个栈实现队列这样的特殊结构


问题分析:

我们靠两个栈实现队列,肯定是一个用来存放入队的数据,一个用来出栈,在这里我们主要关注这个样几个问题:

  • 什么时候队列可以出队?
  • 什么时候队列为空?
  • 什么时候队列可以入队?
  • 什么时候队列为满?
    弄明白这几个问题就可以很容易的解决问题了

下面给出答案(这里不是纯代码描述,说明问题即可):


实现代码:

在这里给出栈的定义与实现,以及用两个栈实现队列的具体代码:

//栈的结构定义与方法声明#define INITSIZE 5typedef int ElemType;typedef struct Stack
{ElemType data[INITSIZE];int top;}Stack;void InitStack(Stack *st,  int init_size);bool  Empty(Stack *st);bool  Push(Stack *st, ElemType value);bool  Pop(Stack *st);bool Top(Stack *st, ElemType *reval);void DestroyStack(Stack *st);
//栈的方法实现#include "stack.h"
#include <stdio.h>
#include <stdlib.h>void InitStack(Stack *st,  int init_size)
{if(st==NULL) exit(0);st->top =0;
}bool  Empty(Stack *st)
{if(st==NULL) exit(0);return st->top ==0;
}bool Full(Stack *st)
{if(st==NULL) exit(0);return st->top ==INITSIZE;
}
bool  Push(Stack *st, ElemType value)
{if(st==NULL) exit(0);if(Full(st)) return false;st->data [st->top ++]=value;return true;
}bool  Pop(Stack *st)
{if(st==NULL) exit(0);if(Empty(st)) return false;st->top --;return true;
}bool Top(Stack *st, ElemType *reval)
{if(st==NULL) exit(0);*reval=st->data[st->top];return true;
}void DestroyStack(Stack *st)
{if(st==NULL) exit(0);while(!Empty(st)){Pop(st);}
}
//队列的结构定义与方法实现typedef struct Queue
{Stack enter;Stack out;}que;void Init_que(que *q)
{if(q==NULL) exit(0);InitStack(&(q->enter),10); //初始化一个栈用来保存入队元素InitStack(&(q->out),10);  //初始化一个栈用来队列出队
}bool Empty_que(que *q)
{if(q==NULL) exit(0);if(Empty(&q->enter) && Empty(&q->out))return true;elsereturn false;
}bool Full_que(que *q)
{if(q==NULL) exit(0);if(!Empty(&q->out) && Full(&q->enter))return true;else return false;
}bool Push_que(que *q,ElemType value)
{if(q==NULL) exit(0);if(Full_que(q)) return false;// 队满if(Full(&q->enter)){ElemType val;while(!Empty(&q->enter)){Top(&q->enter,&val);Pop(&q->enter);Push(&q->out,val);}}Push(&q->enter,value);return true;
}static bool Pop_que(que *q)
{if(q==NULL) exit(0);if(Empty_que(q)) return false;//队空if(Empty(&q->out)){ElemType val;while(!Empty(&q->enter)){Top(&q->enter,&val);Pop(&q->enter);Push(&q->out,val);}}Pop(&q->out);return true;
}static bool Top_que(que *q,ElemType *revalue)
{if(q==NULL) exit(0);if(Empty_que(q)) return false;if(Empty(&q->out)){ElemType val;while(!Empty(&q->enter)){Top(&q->enter,&val);Pop(&q->enter);Push(&q->out,val);}}Top(&q->out,revalue);return true;
}static void Destory_que(que *q)
{if(q==NULL) exit(0);DestroyStack(&q->enter);DestroyStack(&q->out);
}

用两个栈实现一个队列【C语言】相关推荐

  1. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  2. 【剑指offer】用两个栈实现一个队列

    题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...

  3. 剑指offer五:两个栈实现一个队列

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

  4. 两个栈实现一个队列,两个队列实现一个栈

    题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...

  5. python 用两个栈实现一个队列

    | 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...

  6. java实现-两个栈实现一个队列和两个队列实现一个栈

    1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...

  7. python ——两个队列实现一个栈两个栈实现一个队列

    1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...

  8. 两个栈实现一个队列与两个队列实现一个栈

    http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...

  9. 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)

    http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一: 我们设定s1是入栈的,s2是出栈的. 入队列,直 ...

  10. 两个栈实现一个队列/两个队列实现一个栈

    http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...

最新文章

  1. 计算机应用基础学期教学小结,《计算机应用基础》的教学总结及小结.docx
  2. 一个月内取得多项技术进展,详解阿里AI背后的故事
  3. c++ map 析构函数_说说C++的虚析构函数
  4. oracle12c完全卸载工具_oracle完全卸载方法
  5. 一个奇怪的EL表达式错误
  6. Java操作——获取文件扩展名,去掉文件扩展名
  7. php scandir sftp,CentOS 下使用SFTP实现网站自动生成FTP账号,实现Chroot功能
  8. wnoise matlab,MATLAB中用wnoise函数测试去噪算法
  9. C语言复杂声明解读简明方法
  10. 货物与产品的区别_商品与一般物品和其他产品有什么区别?
  11. linux 内核修炼之道——系统调用
  12. Dubbo-admin无法显示Group分组信息
  13. 可方向导不一定连续的例子
  14. 安全攻防六:SQL注入,明明设置了强密码,为什么还会被别人登录
  15. 韩顺平 2021零基础学Java 学习笔记(3)(自用)
  16. matlab汽车仿真实例,基于MATLAB的车辆工程仿真实例
  17. lwj_C#_集合的使用、接口方法的实现;
  18. (收藏自己看)程序员的工作不能用“生产效率”这个词来衡量
  19. 1药网用户暴增500% 声网助力打造高质量视频问诊服务
  20. google相机android10,三星S10+/S10/S10e谷歌相机移植版下载:支持夜视,体验强大算法...

热门文章

  1. 小米android安装包下载安装,小米应用商店安装包下载
  2. Java基础知识面试复习大纲
  3. django ajax 简书,Django中ajax上传图片详细步骤
  4. CrossApp 1.1.6新鲜出炉
  5. postman下载文件乱码
  6. PHP时间戳和日期相互转换操作总结
  7. Java定时任务,定时执行某个操作
  8. 坯子库无法一键安装插件没用_坯子插件库的下载地址、安装以及运用办法
  9. java 图片转pdf_在Java语言中将图像转换为PDF?Spire.PDF for Java轻松搞定!
  10. abaqus python教程_Abaqus-python脚本到底应该怎么写?一文带你入门