C语言实现,队列可伸缩
两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一、思路:1、创建两个空栈A和B;2、A栈作为队列的入口,B栈作为队列的出口;3、入队列操作:即是入栈A;4、出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈;不为空就直接出栈;
二、代码:
1、头文件:stack_to_queue.h:封装了:队列、栈的数据结构和各种操作的函数。

1 #ifndef STACK_TO_QUEUE_H
2 #define STACK_TO_QUEUE_H
3
4 #include<stdio.h>
5 #include<stdlib.h>
6
7 #define ALLOC_SIZE 512
8 #define ElemType int
9
10 typedef struct sqstack
11 {
12 ElemType *top; //栈顶指针
13 ElemType *base; //栈底指针
14 ElemType stack_size; //栈目前的元素数目
15 }SqStack; //顺序栈
16
17 typedef struct sqqueue
18 {
19 SqStack front; //队列头,出口,
20 SqStack rear; //队列尾,入口
21 }SqQueue;
22
23 /*栈的初始化函数*/
24 void InitStack(SqStack *s)
25 {
26 if((s->top=(ElemType*)malloc(ALLOC_SIZE*sizeof(ElemType)))==NULL)
27 {
28 printf("stack malloc error\n");
29 exit(1);
30 }
31 s->base=s->top;
32 s->stack_size=ALLOC_SIZE;
33 }
34
35 /*出栈函数,栈为空时返回0,成功出栈时返回1*/
36 int pop_stack(SqStack *s,ElemType *data)
37 {
38 if(s->top!=s->base)
39 {
40 s->top--;
41 *data=*s->top;
42 return 1;
43 }
44 else //返回值为0,表示栈为空
45 {
46 return 0;
47 }
48 }
49
50 /*入栈函数*/
51 void push_stack(SqStack *s,ElemType data)
52 {
53 if((s->top-s->base)>=s->stack_size)
54 {
55 if((s->base=(ElemType *)realloc(s->base,(s->stack_size+ALLOC_SIZE)*sizeof(ElemType)))==NULL)
56 {
57 printf("stack realloc error\n");
58 exit(1);
59 }
60 else
61 {
62 s->top=s->base+s->stack_size;
63 s->stack_size+=ALLOC_SIZE;
64 }
65 }
66 *(s->top)=data;
67 s->top++;
68 }
69
70 /*队列初始化函数*/
71 void InitQueue(SqQueue *q)
72 {
73 SqStack A,B;
74
75 InitStack(&A);
76 InitStack(&B);
77 q->front=B; //将栈B作为队列的出口
78 q->rear=A; //将栈A作为队列的入口
79 }
80
81 /*入队列函数*/
82 void push_queue(SqQueue *q,ElemType data)
83 {
84 push_stack(&q->rear,data);
85 }
86
87 /*出队列函数,队列为空时返回0,成功出队列返回1*/
88 int pop_queue(SqQueue *q,ElemType *data)
89 {
90 if((pop_stack(&q->front,data))==0) //如果作为出口的栈为空,就将入口栈的内容压入
91 {
92 while((pop_stack(&q->rear,data))!=0)
93 {
94 push_stack(&q->front,*data);
95 }
96 }
97 else //否则,返回1
98 {
99 return 1;
100 }
101 if((pop_stack(&q->front,data))==0) //如果将入口栈的内容压人后还为空,说明此时队列为空
102 {
103 return 0;
104 }
105 else
106 {
107 return 1;
108 }
109 }
110 #endif

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

1 #include<stdio.h>
2 #include"stack_to_queue.h"
3
4 int main()
5 {
6 SqQueue q;
7 int i,data;
8
9 InitQueue(&q);
10 for(i=0;i<1000;i++)
11 {
12 push_queue(&q,i);
13 }
14 while((pop_queue(&q,&data))!=0)
15 {
16 printf("%d ",data);
17 }
18
19 return 0;
20 }

之前写的时候犯了一个错误,在stack_to_queue.h中的62行,使用realloc函数重新分配内存后,要将top指针也指向新的位置,我漏掉了这一步,导致出错,检查了很久,最后的解决过程在这:http://q.cnblogs.com/q/54337/
C语言实现,队列可伸缩的更多相关文章
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
- c语言多线程队列读写
最近用c语言写了个简单的队列服务,记录一下,文件结构为 main.c queue.c queue.h,代码如下: 主函数 #define NUM_THREADS 200 #include <st ...
- C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...
- C语言 复杂队列(链表队列)
//复杂的队列二 --链表队列 #include<stdio.h> #include<stdlib.h> #define datatype int struct queueli ...
- C语言描述队列的实现及操作(链表实现)
// 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...
- C语言描述队列的实现及操作(数组实现)
一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...
- C语言——循环队列和链队列的基本运算
// 循环队列#include <stdio.h> #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20 ...
- C语言链队列
链队列类似于单链表,为了限制只能从两端操作数据,其结构体内有2个指针分别指向头尾,但队列里的节点用另一种结构体来表示,头尾指针则为指向该结构体的类型.只能通过操作头尾指针来操作队列. typedef ...
- C语言顺序队列
顺序队列是一种只能在一头进和另一头出的数据结构,所以结构体里设2个指针分别指向头部和尾部,用数组来存储数据. #define MAXSIZE 1024 typedef int elemtype; ty ...
随机推荐
- auto tool: make -2014-1210-0001
/* *Author : DavidLin *Date : 2014-12-10pm *Email : linpeng1577@163.com or linpeng1577@gmail.com *wo ...
- linux_ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机
使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机. ssh-keygen 创建公钥和密钥. ssh-copy-id 把本地主 ...
- Appium在手机浏览器使用滑屏Not yet implemented解决办法。
在手机浏览器使用swipe.scroll等手机特有行为时,因为默认context是WEBVIEW,所有一定要切换回NATIVE_APP才可以使用. python: driver.switch_to.c ...
- Openstack & Hadoop结合项目Sahara
Openstack 项目Sahara,主要是用来搭建Hadoop集群,利用虚拟出来的计算资源,高速搭建Hadoop集群. Sahara项目与OPenstack其它项目的关系: 图片转自:http:// ...
- 【百度地图API】批量地址解析与批量反地址解析(带商圈数据)
原文:[百度地图API]批量地址解析与批量反地址解析(带商圈数据) 摘要:因为地址解析的webserives方式还没有开通,所以先用JS版本的地址解析接口来批量获取地址解析数据吧,同时还能得到商圈的数 ...
- 使用flex和bison实现的sql引擎解析
因为老师要求,近期在做oceanbase存储过程的实现,在oceanbase 0.4曾经是不支持存储过程的.实现的主要步骤主要包含 1.语法解析 2.词法解析 3.详细运行语法树的步骤 如今先来说说语 ...
- JS代码的几个注意点规范
也谈谈规范JS代码的几个注意点 也谈谈规范JS代码的几个注意点 写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码.这种感觉就像是代码是你的作品, ...
- Hack 语言学习/参考---1.Hack 语言
Table of Contents What is Hack? Hack Background Summary Hack is a language for HHVM that interopates ...
- 国内ng学习网站
Ngnice-国内ng学习网站2015-01-25 21:30 by 破狼, 534 阅读, 3 评论,收藏, 编辑 今天给angular新手介绍一个国内开源的ng学习网站http://www.ngn ...
- cform 开发框架介绍
CForm是从2012年开始研发的一套灵活,易用,简单,成熟的中小型应用系统开发框架.目前已成功应用在浙江大学.温州科技职业学院.广西农业局.青岛市农业局.乐清妇保院.老博会.婚尚起义结婚网等单位. ...