用两个栈实现一个队列【C语言】
问题描述:
考虑用两个栈实现队列这样的特殊结构
问题分析:
我们靠两个栈实现队列,肯定是一个用来存放入队的数据,一个用来出栈,在这里我们主要关注这个样几个问题:
- 什么时候队列可以出队?
- 什么时候队列为空?
- 什么时候队列可以入队?
- 什么时候队列为满?
弄明白这几个问题就可以很容易的解决问题了
下面给出答案(这里不是纯代码描述,说明问题即可):
实现代码:
在这里给出栈的定义与实现,以及用两个栈实现队列的具体代码:
//栈的结构定义与方法声明#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语言】相关推荐
- 多态指针访问虚函数不能被继承的类快速排序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 ...
- 两个栈实现一个队列与两个队列实现一个栈
http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一: 我们设定s1是入栈的,s2是出栈的. 入队列,直 ...
- 两个栈实现一个队列/两个队列实现一个栈
http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...
最新文章
- 计算机应用基础学期教学小结,《计算机应用基础》的教学总结及小结.docx
- 一个月内取得多项技术进展,详解阿里AI背后的故事
- c++ map 析构函数_说说C++的虚析构函数
- oracle12c完全卸载工具_oracle完全卸载方法
- 一个奇怪的EL表达式错误
- Java操作——获取文件扩展名,去掉文件扩展名
- php scandir sftp,CentOS 下使用SFTP实现网站自动生成FTP账号,实现Chroot功能
- wnoise matlab,MATLAB中用wnoise函数测试去噪算法
- C语言复杂声明解读简明方法
- 货物与产品的区别_商品与一般物品和其他产品有什么区别?
- linux 内核修炼之道——系统调用
- Dubbo-admin无法显示Group分组信息
- 可方向导不一定连续的例子
- 安全攻防六:SQL注入,明明设置了强密码,为什么还会被别人登录
- 韩顺平 2021零基础学Java 学习笔记(3)(自用)
- matlab汽车仿真实例,基于MATLAB的车辆工程仿真实例
- lwj_C#_集合的使用、接口方法的实现;
- (收藏自己看)程序员的工作不能用“生产效率”这个词来衡量
- 1药网用户暴增500% 声网助力打造高质量视频问诊服务
- google相机android10,三星S10+/S10/S10e谷歌相机移植版下载:支持夜视,体验强大算法...
热门文章
- 小米android安装包下载安装,小米应用商店安装包下载
- Java基础知识面试复习大纲
- django ajax 简书,Django中ajax上传图片详细步骤
- CrossApp 1.1.6新鲜出炉
- postman下载文件乱码
- PHP时间戳和日期相互转换操作总结
- Java定时任务,定时执行某个操作
- 坯子库无法一键安装插件没用_坯子插件库的下载地址、安装以及运用办法
- java 图片转pdf_在Java语言中将图像转换为PDF?Spire.PDF for Java轻松搞定!
- abaqus python教程_Abaqus-python脚本到底应该怎么写?一文带你入门