顺序队列的表示和实现

表示

typedef struct {
    data_t    data[N];
    int    front;    /* front always points to the "cycle-head",
                     * i.e. point to the previous postion of queue front
                     */
    int    rear;    /* rear point to the rear postion element of the queue */

}sequeue_t;

实现

sequeue_t *CreateEmptySequeue(void)
{
    sequeue_t *queue;
    queue = (sequeue_t *)malloc(sizeof(sequeue_t));
    if (NULL != queue) {
        queue->front = queue->rear = 0;
        return queue;
    } else {
        return NULL;
    }
}

int ClearSequeue(sequeue_t *queue)
{
    if (NULL != queue) {
        queue->front = queue->rear = 0;
        return 0;
    } else {
        return -1;
    }
}

int DestroySequeue(sequeue_t *queue)
{
    if (NULL != queue) {
        free(queue);
        return 0;
    } else {
        return -1;
    }
}

int EmptySequeue(sequeue_t *queue)
{
    if (NULL != queue) {
        return (queue->front == queue->rear ? 1 : 0);
    } else {
        return -1;
    }
}

int FullSequeue(sequeue_t *queue)
{
    if (NULL != queue) {
        return ((queue->rear + 1) % N == queue->front ? 1 : 0);
    } else {
        return -1;
    }
}

int EnQueue(sequeue_t *queue, data_t x)
{
    if (NULL == queue) return -1;
    if (FullSequeue(queue)) return -1;

    queue->rear = (queue->rear + 1)%N;
    queue->data[queue->rear] = x;

    return 0;
}

int DeQueue(sequeue_t *queue, data_t *x)
{
    if (NULL == queue) return -1;
    if (EmptySequeue(queue)) return -1;

    if (NULL != x) {

        queue->front = (queue->front + 1) % N;
        *x = queue->data[queue->front];
    }
    return 0;
}

测试代码

void iterate_queue(sequeue_t * queue)
{
    int i;

    data_t a[N];

    if (!queue) return;

    for (i = 0; i < N; i++) {
        a[i] = ‘_‘;
    }

    i = queue->front;
    a[i] = ‘x‘;

    while (i != queue->rear) {
        i++;
        i = i % N;
        a[i]= queue->data[i];
    }

    printf("queue = (f(%d),r(%d)) {", queue->front, queue->rear);

    for (i = 0; i < N; i++) {
        printf("%c ", a[i]);
    }
    printf("\b}\n");
}

int main()
{
    int i;
    data_t data;
    sequeue_t *queue;

    queue = CreateEmptySequeue();

    printf("First round!-----------------------------------------------\n");
    for (i = 0; i < 20; i++) {
        if ( !FullSequeue(queue) ) {
            printf("Enter %c: ", ‘1‘ + i);
            EnQueue(queue, ‘1‘ + i);
            iterate_queue(queue);
        } else {
            printf("queue is full\n");
            break;
        }
    }

    while ( !EmptySequeue(queue) ){
        DeQueue(queue, &data);
        printf("Out   %c: ", data);
        iterate_queue(queue);
    }

    printf("Second round!----------------------------------------------\n");

    for (i = 0; i < 20; i++) {
        if ( !FullSequeue(queue) ) {
            printf("Enter %c: ", ‘1‘ + i);
            EnQueue(queue, ‘1‘ + i);
            iterate_queue(queue);
        } else {
            printf("queue is full\n");
            break;
        }
    }

    while ( !EmptySequeue(queue) ){
        DeQueue(queue, &data);
        printf("Out   %c: ", data);
        iterate_queue(queue);
    }

    DestroySequeue(queue);

    return 0;
}

结果

First round!-----------------------------------------------
Enter 1: queue = (f(0),r(1)) {x 1 _ _ _ _ _ _ _ _}
Enter 2: queue = (f(0),r(2)) {x 1 2 _ _ _ _ _ _ _}
Enter 3: queue = (f(0),r(3)) {x 1 2 3 _ _ _ _ _ _}
Enter 4: queue = (f(0),r(4)) {x 1 2 3 4 _ _ _ _ _}
Enter 5: queue = (f(0),r(5)) {x 1 2 3 4 5 _ _ _ _}
Enter 6: queue = (f(0),r(6)) {x 1 2 3 4 5 6 _ _ _}
Enter 7: queue = (f(0),r(7)) {x 1 2 3 4 5 6 7 _ _}
Enter 8: queue = (f(0),r(8)) {x 1 2 3 4 5 6 7 8 _}
Enter 9: queue = (f(0),r(9)) {x 1 2 3 4 5 6 7 8 9}
queue is full
Out   1: queue = (f(1),r(9)) {_ x 2 3 4 5 6 7 8 9}
Out   2: queue = (f(2),r(9)) {_ _ x 3 4 5 6 7 8 9}
Out   3: queue = (f(3),r(9)) {_ _ _ x 4 5 6 7 8 9}
Out   4: queue = (f(4),r(9)) {_ _ _ _ x 5 6 7 8 9}
Out   5: queue = (f(5),r(9)) {_ _ _ _ _ x 6 7 8 9}
Out   6: queue = (f(6),r(9)) {_ _ _ _ _ _ x 7 8 9}
Out   7: queue = (f(7),r(9)) {_ _ _ _ _ _ _ x 8 9}
Out   8: queue = (f(8),r(9)) {_ _ _ _ _ _ _ _ x 9}
Out   9: queue = (f(9),r(9)) {_ _ _ _ _ _ _ _ _ x}
Second round!----------------------------------------------
Enter 1: queue = (f(9),r(0)) {1 _ _ _ _ _ _ _ _ x}
Enter 2: queue = (f(9),r(1)) {1 2 _ _ _ _ _ _ _ x}
Enter 3: queue = (f(9),r(2)) {1 2 3 _ _ _ _ _ _ x}
Enter 4: queue = (f(9),r(3)) {1 2 3 4 _ _ _ _ _ x}
Enter 5: queue = (f(9),r(4)) {1 2 3 4 5 _ _ _ _ x}
Enter 6: queue = (f(9),r(5)) {1 2 3 4 5 6 _ _ _ x}
Enter 7: queue = (f(9),r(6)) {1 2 3 4 5 6 7 _ _ x}
Enter 8: queue = (f(9),r(7)) {1 2 3 4 5 6 7 8 _ x}
Enter 9: queue = (f(9),r(8)) {1 2 3 4 5 6 7 8 9 x}
queue is full
Out   1: queue = (f(0),r(8)) {x 2 3 4 5 6 7 8 9 _}
Out   2: queue = (f(1),r(8)) {_ x 3 4 5 6 7 8 9 _}
Out   3: queue = (f(2),r(8)) {_ _ x 4 5 6 7 8 9 _}
Out   4: queue = (f(3),r(8)) {_ _ _ x 5 6 7 8 9 _}
Out   5: queue = (f(4),r(8)) {_ _ _ _ x 6 7 8 9 _}
Out   6: queue = (f(5),r(8)) {_ _ _ _ _ x 7 8 9 _}
Out   7: queue = (f(6),r(8)) {_ _ _ _ _ _ x 8 9 _}
Out   8: queue = (f(7),r(8)) {_ _ _ _ _ _ _ x 9 _}
Out   9: queue = (f(8),r(8)) {_ _ _ _ _ _ _ _ x _}
时间: 2024-09-29 22:08:50

顺序队列的表示和实现的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

顺序队列实现任务以此执行-任务调度系列2

顺序队列实现任务以此执行的想法: public class TaskManage { //任务队列 private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(10); private boolean running = false; public void start() { running = true; Thread t = new Thread(new OrderedJob()); t.s

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

【小白成长撸】--循环顺序队列

1 // 循环顺序队列.cpp : 定义控制台应用程序的入口点. 2 //适合整数 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 7 #define MAXNUM 100 8 #define true 1 9 #define false 0 10 11 typedef struct queue_type 12 { 13 int queue[MAXNUM];//队列的最大值为100 14 int front;//头指针 15 in

数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .

上节已经提到有三种方法来实现循环顺序队列,其中第一种设立标识不常用,最常的就是后两种,上一节已经讨论了用计数器来实现循环顺序队列,这节就用第三种方法,也就是少用一个存储空间来实现循环顺序队列,其基本操作和用计数实现类同,下面是具体实现: 顺序队列(循环队列)类型描述: //顺序队列的类型描述 #define MAXSIZE 5 typedef int ElemType; typedef struct{ ElemType *data; int front,rear; }SqQueue; 基本操作:

顺序队列总结

基本数据结构之-顺序队列 顺序队列就是对开辟在堆上的一段连续空间的操作 队列有入队和出队的操作,如果把开始的位置作为队头,那么在入队的时候需要移动数据,如果把末尾做为队头,在出队的时候需要移动元素,所以使用哪种方法都没有简单的, 其实可以指定两个参数来标记队列中队头和对尾的位置,但是在入队和出队的时候就需把这种情况考虑进去.(其实这就成了循环队列了,哈哈) 今天还是写顺序队列吧 //分析需要一个容量(因为需要动态的开辟空间来存储数据) // 需要一个长度来记录当前数据的长度 typedef st

顺序队列和链式队列的实现

队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据.队列跟栈不同,栈是一种"后进先出"的模式,而队列是一种"先进先出"的操作模式.就好比日常排队一样,先排队的先出,后排队的后出.例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况). 队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现. 顺序队列: //顺序队列 #include

【数据结构】顺序队列的实现(c++)

头文件: #pragma once #include <iostream> #include <assert.h> using namespace std; template<class Type> class SeqQueue { public: SeqQueue(size_t sz = INIT_SZ); ~SeqQueue(); public: bool empty()const; bool full()const; void show()const; bool

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表.同意插入的一端叫做队尾(rear),同意删除的一端叫做队首(front). 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的.基于数组的叫做顺序队列.基于列表的叫做链式队列. 一下是基于动态数组的顺序队列的模板类的实现. 顺序队列的抽象基类例如以下所看到的:仅仅提供了接口和显式的默认构造函数和析构函数,在派生类中调用. #ifndef QUEUE #define QUEUE //队列的抽象基类 template<class T> cla

数据结构-循环顺序队列的基本操作

//循环顺序队列的基本操作 #include <iostream> #include <string.h> using namespace std; #define MAXLEN 8 #define datatype char #define Status int typedef struct{ datatype s[MAXLEN]; int front; //记录队首的指针 int rear; //记录队尾的指针 }SeqQueue; //初始化 Status InitSeqQu