两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一、思路: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语言实现,队列可伸缩,容纳任意数目的元素。的更多相关文章
- 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.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...
- (LeetCode)用两个栈实现一个队列
LeetCode上面的一道题目.原文例如以下: Implement the following operations of a queue using stacks. push(x) -- Push ...
- 【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列
#include<iostream> #include<stack> using namespace std; template <typename T> void ...
随机推荐
- 2D UI和3D UI的工作原理
2D UI的工作原理 UI控件的位置在UI Root 的红框(视窗)上,也就是UI控件的z轴,相机的z轴,UI Root的z轴都是0,因为2D UI都是纯粹的2D图片按层次显示,不会不出现三维立体效果 ...
- 几个.net的GUI控件库
https://github.com/firstfloorsoftware/mui http://wpftoolkit.codeplex.com/ https://github.com/fluentr ...
- Jquery.Validate验证CheckBoxList,RadioButtonList,DropDownList是否选中
http://blog.csdn.net/fox123871/article/details/8108030 <script type="text/javascript"&g ...
- SQL按日期Datatime来比较大小
数据库操作中,通常需要选择某日期以后的记录,比如选择10年1月到11年2月之间的记录,此时用SQL语句编写时,不能直接用">.<.="来选择,因为datetime型数据 ...
- char和QChar(Unicode的编码与内存里的值还不是一回事)
char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析.比如: char gemfield=’g’; 那么在由gemfield标记的这块内存的大小就是1个字节,信息就是01100111, ...
- Nuget
Install-Package Microsoft.AspNet.WebApi.Cors
- java代码转换为c# 工具
Demo Java to C# Converter.exe 已下载到 F:\SoftWare-new\java\Java_to_CSharp_Converter.rar
- Visual Studio 那些隐藏的调试功能(转)
原文出处: 微软互联网开发支持 Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...
- C#实现微信公众号群发消息(突破破解一天只能发一次的限制)
总体思路:1.首先必须要在微信公众平台上申请一个公众号. 2.然后进行模拟登陆.(由于我对http传输原理和编程不是特别懂,在模拟登陆的地方,不是特别清楚,希望有大神指教) 3.模拟登陆后会获得一个t ...
- Wordpress prettyPhoto插件跨站脚本漏洞
漏洞名称: Wordpress prettyPhoto插件跨站脚本漏洞 CNNVD编号: CNNVD-201311-413 发布时间: 2013-11-28 更新时间: 2013-11-28 危害等级 ...