用顺序表实现一个循环队列

  队列是一种先进先出的线性表,简称FIFO。允许插入的一端为队尾,允许出列的一端为队头。

比如一个队列q=(p1,p2,p3,p4...pn),p1就是那个队头,pn就是队尾。出列时总是从p1开始

向后,入列时总是从pn后面插入。就像敲键盘,依次敲qwr,屏幕上显示的就是qwr,先敲的先显

示。

 以下代码是用顺序表实现一个循环队列

  1 /**
  2   * @filename queue.c
  3   * @author   haohaibo
  4   * @data      2017/4/12
  5   * @brief       用顺序表实现一个循环队列
  6 **/
  7 #include <stdio.h>
  8 #include <stdlib.h>
  9 #define N 9
 10 typedef int datatype_t ;
 11
 12 typedef    struct{
 13     datatype_t data[N];
 14     int front;
 15     int real;
 16 }seqqueue_t;
 17
 18 /**
 19   * @brief     输出头指针和尾指针用于调试
 20  */
 21 void showpos(seqqueue_t *sq)
 22 {
 23     printf("real=%d\n",sq->real);
 24     printf("front=%d\n",sq->front);
 25 }
 26
 27 /**
 28   * @brief 创建一个队列
 29  */
 30 seqqueue_t *seqqueue_create()
 31 {
 32     seqqueue_t *sq;
 33     sq=(seqqueue_t  *)malloc(sizeof(seqqueue_t));
 34     sq->front=0;
 35     sq->real=0;
 36     return sq;
 37 }
 38
 39 /**
 40   * @brief 清空队列
 41  */
 42 void seqqueue_clear(seqqueue_t *sq)
 43 {
 44     sq->front=0;
 45     sq->real=0;
 46 }
 47
 48 /**
 49   * @brief 队列满
 50  */
 51 int seqqueue_full(seqqueue_t *sq)
 52 {
 53     if((sq->real+1)%N==sq->front)
 54     {
 55         puts("seqqueue full");
 56         return 1;
 57     }
 58         return 0;
 59
 60 }
 61
 62 /**
 63   * @brief 队列空
 64  */
 65 int seqqueue_empty(seqqueue_t *sq)
 66 {
 67     if(sq->real==sq->front)
 68     {
 69         puts("seqqueue full");
 70         return 1;
 71     }
 72     return 0;
 73 }
 74
 75 /**
 76   * @brief 插入数据
 77  */
 78 int seqqueue_push(seqqueue_t *sq,datatype_t value)
 79 {
 80     if(seqqueue_full(sq))
 81     return -1;
 82     //sq->real++;
 83     sq->data[sq->real]=value;
 84     sq->real=(sq->real+1)%N;
 85     return 0;
 86 }
 87 /**
 88   * @brief 数据出列
 89  */
 90 datatype_t seqqueue_pop(seqqueue_t *sq)
 91 {
 92     datatype_t value;
 93     if(seqqueue_empty(sq))
 94     exit(1);
 95     value=sq->data[sq->front];
 96     sq->front=(sq->front+1)%N;
 97     return value;
 98 }
 99
100 /**
101   * @brief 多次数据出列,忽略返回值,仅做调试用
102  */
103 datatype_t seqqueue_pop_n(seqqueue_t *sq,int n)
104 {
105     printf("queue pop count=%d.\n",n);
106     while(n--)
107     seqqueue_pop(sq);
108     return 0;
109 }
110
111 /**
112   * @brief 打印队列数据
113  */
114 int seqqueue_show(seqqueue_t *sq)
115 {
116     int i=0;
117     printf("queue data: ");
118     if(sq->real>=sq->front)
119     {
120         for(i=sq->front;i<sq->real;i++)
121         printf("%d ",sq->data[i]);
122     }
123     else
124     {
125         for(i=sq->front;i<N;i++)
126         printf("%d ",sq->data[i]);
127         for(i=0;i<sq->real;i++)
128         printf("%d ",sq->data[i]);
129     }
130     putchar(10);
131 }
132
133
134 int main(void)
135 {
136     seqqueue_t *sq1;
137     sq1=seqqueue_create();
138     seqqueue_push(sq1,1);
139     seqqueue_push(sq1,2);
140     seqqueue_push(sq1,3);
141     seqqueue_push(sq1,4);
142     seqqueue_push(sq1,5);
143     seqqueue_push(sq1,6);
144     seqqueue_push(sq1,7);
145     seqqueue_show(sq1);
146     seqqueue_pop_n(sq1,5);
147     seqqueue_show(sq1);
148     seqqueue_push(sq1,1);
149     seqqueue_push(sq1,2);
150     seqqueue_push(sq1,3);
151     seqqueue_push(sq1,4);
152     seqqueue_push(sq1,5);
153     seqqueue_show(sq1);
154     seqqueue_pop_n(sq1,5);
155     seqqueue_show(sq1);
156 }
时间: 2024-11-15 17:59:50

用顺序表实现一个循环队列的相关文章

DS之顺序表实现乱序输入顺序输出

顺序表的实例有很多,在学其他的编程语言时,肯定都学过要求输入一串乱序的数字,要求进行排序,实现升序或降序输出.今天就来用顺序表实现乱序输入,顺序输出(升序). 实现上述的功能需要用到的顺序表的基本操作有0基本操作前的准备,1初始化顺序表,6向顺序表插入数据元素. 自己只需写一个排序的函数,排序函数的代码为: <span style="font-size:18px;">//排序函数 void paixu(SqList &L) { for(int i=0;i<L.

DS之顺序表实现输入数据逆置

实现输入数据逆置和顺序表实现排序是两个极其相似的过程,因此使用的顺序表的基本操作也是一样的:0基本操作前的准备,1初始化顺序表,6向顺序表插入数据元素. 要想实现输入数据元素的逆置还需要一个逆置函数,逆置函数在C++,C#语言中早已接触过,因此不陌生,记得在做大量的C++的程序代码补充的大题就写过不下数十遍,挺简单的掌握技巧,就是你输入数据的个数的一半,前后进行交换,因此逆置函数的代码为: <span style="font-size:18px;">//逆置函数 void

利用数组创建的顺序表实现各种功能

主函数main.c #include "func.h" #define MAXSIZE 100 INT32 main( void ) { INT32 temp[MAXSIZE] = {NULL}, f = 0, OSM = 1; OSM = create_SL (temp); do { OSM = OSM_Printf("\n\t========================================\n"); OSM = OSM_Printf("

用顺序表实现求两个集合的并集

#include<iostream.h> #include<malloc.h> #include<limits.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<stdlib.h> #include<process.h> #define OK 1 #define INIT_LiST_SIZE 100//顺序表的初始长度 #de

c++:用顺序表实现简单的栈

main.cpp #include<iostream> #include<string> #include"Stack.hpp" using namespace std; void test1(){                     //测试 Stack<int> s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop();

各路大神大显神通!帮帮忙如何使用顺序表实现以下任务

5r0lp9k32a伟矢汗仲颐窍郊系拖脑<http://weibo.com/p/230927987720190915518464> aki6we5yzu占麓仕掩妒辖枚睬啥刭<http://weibo.com/p/230927987720126407122944> vxbanbazps律男烁稳倮酝肺肺苫捶<http://weibo.com/p/230927987723046619975680> n3o87qg51q刀纺芈徽萍炙泊偬切塘<http://weibo.co

基本数据结构,循环队列的顺序实现。

队列是一种先进先出的数据结构,这里用顺序结构将其实现. 1.首先用结构体定义一个队列,front指向队首元素的前面一位,real指向队尾元素. 1 //队列的结构定义 2 #define MAX 6 3 typedef struct { 4 int front,real; 5 int data[MAX]; 6 }queue; 2.创建一个循环队列,初始化令front=real=0,因为当队列满时也有front=real,此时无法判断队满:所以我们弃置一个元素位不用,其位置随机,所以队列的实际最大

看数据结构写代码(16)顺序队列的实现(循环队列)

循环队列的基本结构如下: front 属性 表示 队头,rear 属性表示 队尾. 在队空时 :q.rear 和 q.front 都为0 ,其余时刻q.rear 指向 队尾的后继节点,q.front指向 队头. 当在队尾插入元素时,q.rear + 1 ,在删除 队头元素时 ,q.front + 1,这样的操作 会造成 "假溢出"问题. 图(d) 就是一种 假溢出 问题,q.rear 指向 空间的边界,再插入 会造成 溢出,但是 实际上 空间 并未满. 为了解决假溢出,将 队列 看成

循环队列(0965)

p { margin-bottom: 0.25cm; line-height: 120% } 描述 根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间.例如,给定5个元素空间构造循环队列,则只能存放4个元素.试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值.要求采用顺序队列完成,少用一个存储空间的方法区分队列的空和满. input 输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数. 第二行为操作