转【c语言】两个堆栈组成一个队列
假设有两个堆栈,分别是s1,s2,现在有数列“1,2,3,4,5”,要让这个数列实现先进先出的功能,也就是用两个堆栈组成一个队列,如何实现?
分析:
先将数列压入栈s1,数列在栈中由顶到底的元素为“5,4,3,2,1”,再将数列压入栈s2,数列在栈中由顶到底的元素为“1,2,3,4,5”,如此出栈,则是“1,2,3,4,5”。
必须注意,实现队列中的入队操作以及出队操作,并非如同上述操作那么直观。上述操作有一个前提,即两个栈都没有元素。而一般情况,s1和s2中都可能有元素或者没有元素。所以要抽象出更一般的入队以及出队操作。
入队操作:先将s2中的所有元素出栈,再压入s1中,将要进栈的元素压入s1。
出队操作:先将s1中的所有元素出栈,再压入s2,再从s2中出栈,则得到将要出队列的元素。
我的代码,简单实现,未包含所有的队列操作。

#include <stdio.h>
#include <stdlib.h> typedef struct NODE{
struct NODE * next;
int data;
}node; typedef struct STACK{
node * head;
int len;
}stack; typedef struct QUEUE{
stack * fstack;
stack * bstack;
}queue; stack * init(void){
stack * List=(stack *) malloc(sizeof(stack));
List->head=NULL;
List->len=0;
return List; } int pop(stack *st){
if(0>=st->len||NULL == st) {
printf("NULL stack,leaving now\n");
exit(1);
}
int pdata=st->head->data;
st->head=st->head->next;
st->len--;
return pdata;
} void push(stack *st, int n){
if(NULL == st|| 0>st->len){
printf("wrong stack,please check the source code, now leaving\n");
exit(1);
}
node * pp=(node*)malloc(sizeof(node));
pp->next=st->head;
pp->data=n;
st->head=pp;
st->len++;
} queue * init_queue(void){
queue * qe=(queue*)malloc(sizeof(queue));
stack *st1,*st2;
st1=init();
st2=init();
qe->fstack=st1;
qe->bstack=st2;
return qe;
} int dequeue(queue * qe){
int tmp; if (NULL ==qe ){printf("wrong in queue,now leaving\n");exit(1);}
if(0==qe->fstack->len && 0==qe->bstack->len)
{
printf("no element in queue,now leaving \n");
exit(1);
}else if( 0==qe->fstack->len){/* qe->bstack->len != 0*/
tmp=pop(qe->bstack);
return tmp;
}else{ /* qe->fstack ->len !=0 && qe->bstack->len !=0 */
while(qe->fstack->len !=0){
tmp=pop(qe->fstack);
push(qe->bstack,tmp);
}
tmp=pop(qe->bstack);
return tmp;
}
} void enqueue(queue * qe, int n){
int tmp;
if( NULL == qe ){printf("NULL queue,wrong, now leaving \n");exit(1);} while(qe->bstack->len !=0){
tmp=pop(qe->bstack);
push(qe->fstack,tmp);
}
push(qe->fstack,n);
} int main(){
queue * qe=init_queue(); #if 1 /* test*/
int n=5;
while(n>0){
enqueue(qe,n);
n--;
}
int tmp=dequeue(qe);
printf("%d\n",tmp);
tmp=dequeue(qe);
printf("%d\n",tmp);
#endif
return 0;
}

转【c语言】两个堆栈组成一个队列的更多相关文章
- Python两个栈实现一个队列
牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...
- web前端面试系列 - 数据结构(两个栈模拟一个队列)
一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...
- python两个队列实现一个栈和两个栈实现一个队列
1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...
- 剑指offer(五):用两个栈实现一个队列
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...
- 剑指offer:用两个栈实现一个队列
题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
- 用两个栈实现一个队列(C++)
分析 栈:后进先出 队列:先进先出 要使用两个栈实现队列(先进先出),主要思路是 1.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...
- (LeetCode)用两个栈实现一个队列
LeetCode上面的一道题目.原文例如以下: Implement the following operations of a queue using stacks. push(x) -- Push ...
随机推荐
- python分包写入文件,写入固定字节内容,当包达到指定大小时继续写入新文件
第6行通过 for 循环控制生成 .log 文件的数量 第8行,如果该文件存在时先进行清空,然后再进行写入操作 第13行,将文件大小的单位转为MB 第14行,如果文件大小超过1MB时,跳出当前循环,重 ...
- 寒假集训——搜索 D - Cubes for Masha
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h&g ...
- 「雅礼集训 2017 Day7」事情的相似度
「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...
- Django复习之ORM
QuerySet数据类型: 1.可切片,可迭代 [obj,....] 2.惰性查询: ...
- javascript中DOM0,DOM2,DOM3级事件模型解析
DOM 即 文档对象模型. 文档对象模型是一种与编程语言及平台无关的API(Application programming Interface),借助于它,程序能够动态地访问和修改文档内容.结构或显示 ...
- WINS服务器与DNS服务器有什么区别?
1.WINS实现的是IP地址和计算机名称的映射,DNS实现的是IP地址和域名的映射.2.WINS作用的范围是某个内部网络,DNS的范围是整个互联网.简单说明一下:WINS实现的是IP地址和计算机名称的 ...
- (零 ) 天猫精灵接入Home Assistant-总说明
天猫精灵设备管理 https://bbs.hassbian.com/tmall 自己的hass访问地址 http://[自己的IP或域名]:8123/states 自己的MQTT服务器访问 http: ...
- Plotagraph软件五分钟光速速成傻瓜教程
http://bbs.dji.com/thread-144203-1-1.html 让照片变成动态的
- solidity-library
library 1)直接使用使用库合约的合约,可以将库合约视为隐式的父合约(base contracts),当然它们不会显式的出现在继承关系中.意思就是不用写is来继承,直接可以在合约中使用: lib ...
- Java内存区域划分、内存分配原理(转)
文章引用自 http://blog.csdn.net/OyangYujun/article/details/41173747 运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若 ...