数据结构——顺序队列

原创 2018年04月15日 08:45:02

一、基本概念

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。进行插入的一端称为队尾(入队列),进行删除操作的一端称为称为队头(出队列),队列具有先进先出(FIFO)的特性。
这里写图片描述
队列的基本操作:

  • 初始化队列
  • 进队列
  • 出队列
  • 判断队列是否为空
  • 判断队列是否已满
    队列可以由数组和链表两种形式实现队列的操作,分别称为顺序队列和链队列
    顺序队列:顺序存储的队列
    链队列:链式存储的队列,长度没有限制

二、顺序队列

我们一直都是用数组来实现顺序存储的,顺序队列也不例外,所以我们需要的是用一个数组int data[MAXSIZE]来存储队列的元素,另外我们还需要两个进行标记下标的数head和tail,来标记队头和队尾。
下面是一个循环队列,基于数组实现的队列的结构:
这里写图片描述
队列通常可以分为两种类型:
①链式队列(由链表实现)。
②静态队列(由数组实现),静态队列通常都必须是循环队列。
由于链式队列跟链表差不多,所以在这里只针对循环队列来说明并实践。
循环队列的两个参数:
①head,head指向队列的第一个元素。
②tail,tail指向队列的最后一个有效元素的下一元素。
队列的两个基本操作:出队和入队。

三、实现

1、顺序队列的初始化和打印

void SeqQInit(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    sq->size = 0;
    sq->head = 0;
    sq->tail = 0;
}
void SeqQPrint(SeqQ* sq, const char* msg){
    printf("[%s]\n", msg);
    if (sq == NULL){
        return;
    }
    int i = sq->head;
    for (; i<sq->tail; i++){
        printf("[%c|%p]", sq->data[i]);
    }
    printf("\n");
}

2、销毁和进行扩容

void SeqQDestroy(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    sq->size = 0;
    sq->head = 0;
    sq->tail = 0;
}
void SeqQResize(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    if (sq->size <= MAXSIZE){
        return;
    }

    int size = MAXSIZE * 2 + 1;
    SeqQType* new = (SeqQType*)malloc(sizeof(SeqQType));
    int i = 0;
    for (; i<sq->size; i++){
        new[i] = sq->data[i];
    }
    free(sq->data);
}

3、入队列

void SeqQPush(SeqQ* sq, SeqQType  value){
    if (sq == NULL){
        return;
    }
    if (sq->size>=MAXSIZE){
        SeqQResize(sq);
        return;
    }  
    sq->data[sq->tail++] = value;
    if (sq->tail == MAXSIZE){
        sq->tail = 0;
    }
    ++sq->size;
}

4、出队列
我们在进行顺序队列的时候,当我们想要进行出队列操作的时候,我们主要实现的过程就是让我们的head-1,让tail进行加1操作,这样就能实现将我们不要的元素进行出队列。

void SeqQPop(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    if (sq->size == 0){
        return;
    }
    ++sq->head;
    if (sq->head >= MAXSIZE){
        sq->head = 0;
    }
    --sq->size;
}

5、取队首元素
取队首元素的时候我们直接就考虑取head指向的元素,这就是队首元素。队列遵循的原则是先进先出,所以我们直接取head下标指向的元素就是我们最后想要的元素。

int  SeqQFront(SeqQ* sq, SeqQType* value){
    if (sq == NULL || value==NULL){
        return -1;
    }
    if (sq->size == 0){
        return -1;
    }
    *value = sq->data[(sq->head)];//注意在这里考虑优先级的问题
    return *value;
}

相关的测试函数

#defineTEST_HEADE printf("\n===========%s==============\n",__FUNCTION__);

void test1(){
    SeqQ  sq;
    SeqQInit(&sq);
    SeqQPush(&sq, 'a');
    SeqQPush(&sq, 'b');
    SeqQPush(&sq, 'c');
    SeqQPush(&sq, 'd');
    SeqQPrint(&sq, "入队列四个元素");

}
void test2(){
    SeqQ  sq;
    SeqQInit(&sq);
    SeqQPush(&sq, 'a');
    SeqQPush(&sq, 'b');
    SeqQPush(&sq, 'c');
    SeqQPush(&sq, 'd');
    SeqQPrint(&sq, "入队列四个元素");
    SeqQPop(&sq);
    SeqQPrint(&sq, "出队列一个元素");
    SeqQPop(&sq);
    SeqQPrint(&sq, "出队列两个元素");
    SeqQPop(&sq);
    SeqQPrint(&sq, "出队列三个元素");
    SeqQPop(&sq);
    SeqQPrint(&sq, "出队列四个元素");
}

void test3(){
    SeqQ  sq;
    SeqQInit(&sq);
    SeqQPush(&sq, 'g');
    SeqQPush(&sq, 'b');
    SeqQPush(&sq, 'c');
    SeqQPush(&sq, 'd');
    SeqQPrint(&sq, "入队列四个元素");
    SeqQType value;
    int i = SeqQFront(&sq, &value);
    printf("%c\n", i);
}
int main(){

    test1();
    test2();
    test3();
    getchar();
    return;
}

数据结构基础系列(3):栈和队列

-
  • 1970年01月01日 08:00

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

在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放队列头到队列尾的元素之外,常常另设两个指针front和rear分别表示队列头元素及队列为的元素。 这里我们做约定:初始化建立空队列时,令f...
  • longgongshiye
  • longgongshiye
  • 2013-07-08 18:09:17
  • 681

数据结构顺序队列的各种操作

/** 头文件stu.h @jeasn168 */ #include #include #define MaxS 50 typedef st...
  • jeasn168
  • jeasn168
  • 2013-05-21 21:49:11
  • 461

数据结构-顺序队列(C语言)

队列:插入数据只在队尾进行,删除数据只在队头进行。 顺序队列操作会出现 假溢出(tail指向队列最后,进行入队操作时,即使前面有空位置也显示队列已满)...
  • Yeziquanquan
  • Yeziquanquan
  • 2016-09-09 00:10:45
  • 2274

数据结构示例之用数组顺序队列

以下为顺序队列的简单实现,由于顺序队列存在两大问题,其一为“假溢出”问题,其二为判断队列是否已满和为空时出现矛盾,因此在实际应用中,一般不使用顺序队列,而是使用圆形队列。 1. 用c语言实现的版本为 ...
  • chinawangfei
  • chinawangfei
  • 2016-10-29 15:49:21
  • 358

C语言数据结构-顺序队列

顺序队列顺序队列与顺序表相似,只不过其具有队列的运算规则。数据只能从队尾进,对头出,为先进先出方式。 分别用两个数来表示队头front和队尾rear的位置,其只能向前增加,不能退后,这样容易溢出且浪...
  • ahafg
  • ahafg
  • 2015-10-11 11:59:37
  • 1768

数据结构实现顺序循环队列

  • 2014年09月16日 16:22
  • 2KB
  • 下载

数据结构课程设计顺序队列操作的验证

  • 2009年12月05日 15:49
  • 128KB
  • 下载

数据结构-循环顺序队(C语言)

循环队列中,空队、满队判决条件(head==tail)出现二义性。 以下代码采用人为浪费一个单元方式解决二义性问题。 空队特征:head=tail 满队特征:head=(tail+1)%QueueMa...
  • Yeziquanquan
  • Yeziquanquan
  • 2016-09-11 01:17:15
  • 925

数据结构之循环顺序队列

  • 2014年05月30日 09:10
  • 1KB
  • 下载
收藏助手
不良信息举报
您举报文章:数据结构——顺序队列
举报原因:
原因补充:

(最多只允许输入30个字)