两个栈实现一个队列,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 ...
随机推荐
- CentOS搭建OpenVPN服务(简易版)
OpenVPN服务端配置 1. 安装OpenVPN软件包 默认的Centos软件源里面没有OpenVPN的软件包,我们可以添加rpmforge的repo,从而实现yum安装openvpn 针对Cent ...
- c++学习之旅-Cygwin+Eclipse ide for c++
一,cygwin下载完毕后配置系统环境片两path指向cygwin/bin 二,eclipse设置 2.1 设置工作目录的cygwin映射 cygwin/d ->d:\ 2.2设置编译 下面新建 ...
- Newtonsoft.Json.JsonWriter
[一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/4754769.html] JsonWriter使用: 前台 $.post("Ajax ...
- asp 下拉框二级联动
<script language = "JavaScript"> //js开始 var aaa;//定义aaa变量 aaa=0;//aaa赋0 bb = new Arr ...
- Android Binder设计与实现 - 设计篇
要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具 ...
- 对TCP/IP网络协议的深入浅出归纳(转)
前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...
- Python和C|C++的混编(一):Python调用C、C++---Boost库
不使用boost.python库来直接构建dll的话比较繁琐,下面实例是借助boost库实现python对C.C++的调用 1 首先确定已经安装python和boost库,本例测试环境是python2 ...
- 【HDOJ】1016 Prime Ring Problem
经典DP,写的可能麻烦了一些. #include <stdio.h> #define false 0 #define true 1 ]; ]; ]; void DFS(int, int, ...
- ERP 实施和应用不成功共同点
ERP 实施和应用不成功共同点 ERP 重新得到人们理性的关注并不意味着实施和应用ERP变得轻而易举了.如何才能实施好ERP?这仍然是关键的问题. 大部份企业应用ERP不成功的原因是什么,许多 ...
- C#实现微信公众号群发消息(突破破解一天只能发一次的限制)
总体思路:1.首先必须要在微信公众平台上申请一个公众号. 2.然后进行模拟登陆.(由于我对http传输原理和编程不是特别懂,在模拟登陆的地方,不是特别清楚,希望有大神指教) 3.模拟登陆后会获得一个t ...