假设有两个堆栈,分别是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语言】两个堆栈组成一个队列的更多相关文章

  1. Python两个栈实现一个队列

    牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...

  2. web前端面试系列 - 数据结构(两个栈模拟一个队列)

    一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...

  3. java两个栈实现一个队列&&两个队列实现一个栈

    栈:先进后出  队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...

  4. python两个队列实现一个栈和两个栈实现一个队列

    1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...

  5. 剑指offer(五):用两个栈实现一个队列

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...

  6. 剑指offer:用两个栈实现一个队列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...

  7. 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。

    一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...

  8. 用两个栈实现一个队列(C++)

    分析 栈:后进先出 队列:先进先出 要使用两个栈实现队列(先进先出),主要思路是 1.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...

  9. (LeetCode)用两个栈实现一个队列

    LeetCode上面的一道题目.原文例如以下: Implement the following operations of a queue using stacks. push(x) -- Push ...

随机推荐

  1. java中的深复制和浅复制

    Java 语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单 的赋值来解决对象复制的问题,在开发过程中,也 ...

  2. centos iftop iotop htop

    centos6.4安装iftopyum install gccyum -y install libpcap libpcap-develyum -y install ncurses ncurses-de ...

  3. vue框架简介

    MVVM框架概述 什么是vue 是一套构建用户界面的渐进式(用到哪一块就用哪一块,不需要全部用上)前端框架,Vue 的核心库只关注视图层 vue的兼容性 Vue.js 不支持 IE8 及其以下版本,因 ...

  4. Properties集合_修改配置信息

    集合中的数据来自于一个文件  注意:必须要保证该文件中的数据是键值对.  需要使用到读取流 使用load()方法读取已有文件中的数据,存储到Properties集合中 public class Pro ...

  5. 用PHP的curl实现并发请求远程文件(并发抓取远程网页)

    PHP的curl功能确实强大了.里面有个curl_multi_init功能,就是批量处理任务.可以利用此,实现多进程同步抓取多条记录,优化普通的网页抓取程序. 一个简单的抓取函数: function ...

  6. 为什么说Redis是单线程的以及Redis为什么这么快!(转)

    文章转自https://blog.csdn.net/chenyao1994/article/details/79491337 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到 ...

  7. PAT A1118 Birds in Forest (25 分)——并查集

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

  8. python之字符串、列表和元组

    先简单的了解一下两个相关概念 模块 python中的模块需要使用特殊的命令import来导入.格式:模块.函数.如下: 在确定自己不会导入多个同名函数的情况下,可以使用import命令的另外一种形式: ...

  9. 安装Drush工具 -Centos

    Drush可以说是Drupal的瑞士***,只要你使用过一段时间的Drush,一但没有它的话,你会觉得很不方便.可如果通过我在前面博文中所讲的方法来安装Drush的话,是不能够支持Drupal8的,所 ...

  10. python 知识2

    零. type()函数怎么使用 type()的使用方法:type(对象)type()是接收一个对象当做参考,之后反回对象的相应类型.>>>type(1)<type 'int'& ...