转【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 ...
随机推荐
- 解决Could not load file or assembly CefSharp.Core.dll的问题
这个问题的中文提示是: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项.找不到指定的模块 具体原因是因为CefSharp运行时需要Visual C++ Redistrib ...
- 合并多个Excel文件
这条分享来自百度经验https://jingyan.baidu.com/article/e6c8503cb6ed7ee54e1a1811.html
- 手把手教你解析Resources.arsc
http://blog.csdn.net/beyond702/article/details/51744082 一.前言 对于APK里面的Resources.arsc文件大家应该都知道是干什么的(不知 ...
- 2190: [SDOI2008]仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- 最长公共子序列(模板 LCSL)
博客: https://www.cnblogs.com/sasuke-/p/5396843.html 模板 #include<iostream>#include<cstdio> ...
- WINS服务器与DNS服务器有什么区别?
1.WINS实现的是IP地址和计算机名称的映射,DNS实现的是IP地址和域名的映射.2.WINS作用的范围是某个内部网络,DNS的范围是整个互联网.简单说明一下:WINS实现的是IP地址和计算机名称的 ...
- 虚拟机oom
解决: 重启服务器或者增加内存
- pstart
下面是我初步的排查过程: [1] [root@71 ~]# tcpdump host 192.168.0.71|grep "IP 115.*"|more tcpdump: verb ...
- How enable deprecated functions in Qt5
问题:Qt5中如何启用以 QT_DEPRECATED_SINCE标识的已经废弃/过时的方法? I want to port a Qt4 program to Qt5 and some function ...
- 【Codeforces 1132D】Stressful Training
Codeforces 1132 D 题意:给\(n\)个电脑的电量和耗电速度,你可以买一个充电器,它的充电速度是每秒\(v\)单位,\(v\)你自己定.问最小的\(v\)能使得在\(k\)秒内每秒给某 ...