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

二、代码:

  1、头文件:stack_to_queue.h:封装了:队列、栈的数据结构和各种操作的函数。

 #ifndef STACK_TO_QUEUE_H
#define STACK_TO_QUEUE_H #include<stdio.h>
#include<stdlib.h> #define ALLOC_SIZE 512
#define ElemType int typedef struct sqstack
{
ElemType *top; //栈顶指针
ElemType *base; //栈底指针
int stack_size; //栈目前能存储的元素数目
}SqStack; //顺序栈 typedef struct sqqueue
{
SqStack front; //队列头,出口,
SqStack rear; //队列尾,入口
}SqQueue; /*栈的初始化函数*/
void InitStack(SqStack *s)
{
if((s->top=(ElemType*)malloc(ALLOC_SIZE*sizeof(ElemType)))==NULL)
{
printf("stack malloc error\n");
exit();
}
s->base=s->top;
s->stack_size=ALLOC_SIZE;
} /*出栈函数,栈为空时返回0,成功出栈时返回1*/
int pop_stack(SqStack *s,ElemType *data)
{
if(s->top!=s->base)
{
s->top--;
*data=*s->top;
return ;
}
else //返回值为0,表示栈为空
{
return ;
}
} /*入栈函数*/
void push_stack(SqStack *s,ElemType data)
{
if((s->top-s->base)>=s->stack_size)
{
if((s->base=(ElemType *)realloc(s->base,(s->stack_size+ALLOC_SIZE)*sizeof(ElemType)))==NULL)
{
printf("stack realloc error\n");
exit();
}
else
{
s->top=s->base+s->stack_size;
s->stack_size+=ALLOC_SIZE;
}
}
*(s->top)=data;
s->top++;
} /*队列初始化函数*/
void InitQueue(SqQueue *q)
{
SqStack A,B; InitStack(&A);
InitStack(&B);
q->front=B; //将栈B作为队列的出口
q->rear=A; //将栈A作为队列的入口
} /*入队列函数*/
void push_queue(SqQueue *q,ElemType data)
{
push_stack(&q->rear,data);
} /*出队列函数,队列为空时返回0,成功出队列返回1*/
int pop_queue(SqQueue *q,ElemType *data)
{
if((pop_stack(&q->front,data))==) //如果作为出口的栈为空,就将入口栈的内容压入
{
while((pop_stack(&q->rear,data))!=)
{
push_stack(&q->front,*data);
}
}
else //否则,返回1
{
return ;
}
if((pop_stack(&q->front,data))==) //如果将入口栈的内容压人后还为空,说明此时队列为空
{
return ;
}
else
{
return ;
}
}
#endif

2、主函数:main.c:只为测试用,通过for循环让1000个数0-999入队列,再打印。

 #include<stdio.h>
#include"stack_to_queue.h" int main()
{
SqQueue q;
int i,data; InitQueue(&q);
for(i=;i<;i++)
{
push_queue(&q,i);
}
while((pop_queue(&q,&data))!=)
{
printf("%d ",data);
} return ;
}

之前写的时候犯了一个错误,在stack_to_queue.h中的62行,使用realloc函数重新分配内存后,要将top指针也指向新的位置,我漏掉了这一步,导致出错,检查了很久,最后的解决过程在这:http://q.cnblogs.com/q/54337/

两个栈实现一个队列,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.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...

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

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

  9. 【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列

    #include<iostream> #include<stack> using namespace std; template <typename T> void ...

随机推荐

  1. Codeforces Round #344 (Div. 2) C. Report

    Report 题意:给长度为n的序列,操作次数为m:n and m (1 ≤ n, m ≤ 200 000) ,操作分为t r,当t = 1时表示将[1,r]序列按非递减排序,t = 2时表示将序列[ ...

  2. 2014年度辛星css教程夏季版第一节

    CSS是Cascading Style Sheets的缩写,即层叠样式表,它用于表现HTML的样式,即HTML只是去写该网页有哪些内容,至于如何去表现它们,由CSS去定制. ************* ...

  3. VisualStudio自定义代码段_方法一

    在VisualStudio里,使用代码段会提高我们的编写速度.其实,就是给一段代码加个快捷方式,使用时,快捷方式按键+2次Tab键. 举个例子: 比如输入Console.WriteLine (); 传 ...

  4. <三> jQuery 选择器

    jQuery 选择器选择需要应用效果的元素,jQuery 元素选择器和属性选择器允许您通过标签名.属性名或内容对 HTML 元素进行选择.选择器允许您对 HTML 元素组或单个元素进行操作. 元素选择 ...

  5. U当家U盘启动盘制作教程

    U当家U盘启动盘制作工具制作u盘系统安装盘支持老机器.新机器启动以及制作,U当家内置强大的U盘一键重装系统工具支持传统和GPT安装,支持原版操作系统和GHOST操作系统安装(ISO/GHO/WIM), ...

  6. C#基础|面向对象之多态

      什么是多态   一句话解释,同一种事物表现出的多种形态. 看完以后,应该还是蒙的,还是看代码吧.. 现有Person类,Student类,Teacher类 其中Person类是Student和Te ...

  7. Javascript事件传播

    MicroSoft的设计是当事件在元素上触发时,该事件将接着在该节点的父节点触发,以此类推,事件一直沿着DOM树向上传播,直到到达顶层对象document元素.这种自底向上的事件传播方式称为" ...

  8. BZOJ 3901 棋盘游戏 解题报告

    这题有个重要性质: 我们设 Flag[i][j] 表示 (i, j) 是否被奇数个操作所覆盖, 也就是操作次数对 2 取模. 设 x = (n + 1) / 2. 那么对于所有的合法的操作方案, 令 ...

  9. C# winform 弹出输入框

    Microsoft.VisualBasic.dll   引用using Microsoft.VisualBasic; string PM = Interaction.InputBox("提示 ...

  10. ASP.NET MVC3 Web应用程序中启用GZip压缩示例

    http://www.mzwu.com/article.asp?id=3284 自定义一个筛选器,继承于GZipAttribute: using System;using System.IO.Comp ...