顺序队列代码

队列:一种特殊的线性表,其特性就是先进先出(FIFO),即从一端进从另一端出

队头:允许删除的一端  front

队尾:允许插入的一端  rear

如下图所示,出队和入队的流程:

---------------------------------------------------------------------------------------------------------------------------------------------------

可以发现,无论是出队还是入队,front指针 和 rear指针都会增加而不是减少,因此很容易造成溢出 和 空间浪费

因此队列因为存在溢出问题所以日常的软件很少使用队列,那么如何解决,先说说两个概念:

假设最大的存储空间是6

假溢出:front != 0 ,rear = M ,再有元素插入时发生溢出 称为假溢出,存储空间还有剩余,如上图最后一张

真溢出:front = 0 ,rear = M,    再有元素插入时发生溢出 称为真溢出,存储空间已满。

因此为了使得空间不被,因此需要允许假溢出行为,即像时钟那样超过最大值则从头开始存储。

所以可以 与 最大值 QUEUE_ MAX_SIZE 取余(mod)  来继续从头开始利用空间。

而真溢出会导致存储值被破坏因此不能允许发生。如果找到满足队列满了的条件就可以阻止真溢出行为。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如上图,可以发现当队列空和满时,front ==  rear,因此为了判断队列是否真的满了,有如下三种方法:

方法一:少用一个存储单元

满的条件为

   (rear + 1)%QUEUE_MAX_SIZE == front

空的条件为

   rear == front

方法二:标志位

添加一个标志位 tag  =  0

当入队成功 tag = 1,出队成功 tag = 0

满的条件为

  rear == front && tag = 1

空的条件为

  rear == front && tag = 0

方法三:计数器

添加一个计数器 count = 0

当入队成功 count++ ,出队成功 count0--

满的条件为

  count > 0  && rear == front

空的条件为

 count == 0

下面是队列的实现代码,使用第一种方法防止溢出

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
#define QUEUE_MAX_LEN 1024

typedef int Status;
typedef int ElemType;
typedef struct{
  ElemType * base;   //基地址
  int front;         //头偏移量
  int rear;          //尾偏移量
} sqQueue;
/***********初始化**********/
Status initQueue(sqQueue *Q){
  Q->base = (ElemType*)malloc(QUEUE_MAX_LEN * sizeof(ElemType));
  Q->front = Q->rear = 0;
  return OK;
}
/**********是否空**********/
Status isEmpty(sqQueue Q){
  if(Q.front == Q.rear)return TRUE;
  else return FALSE;
}
/**********是否满**********/
Status isFull(sqQueue Q){
  if(Q.rear % QUEUE_MAX_LEN +1 == Q.front)return TRUE;
  else return FALSE;
}
/**********获取长度**********/
Status getLength(sqQueue Q){
  return (Q.rear - Q.front + QUEUE_MAX_LEN) % QUEUE_MAX_LEN;
}
/*********获取头值**********/
Status getHead(sqQueue Q,ElemType *e){
  if(isEmpty(Q))return ERROR;
  *e = *(Q.base + Q.front);
  return OK;
}
/***********入队**********/
Status enQueue(sqQueue *Q,ElemType e){
  if(isFull(*Q))return OVERFLOW;
  *( Q->base + Q->rear ) = e;
  Q->rear = (Q->rear + 1)%QUEUE_MAX_LEN;
  return OK;
}
/***********出队**********/Status deQueue(sqQueue *Q,ElemType *e){
  if(isEmpty(*Q))return OVERFLOW;
  *e = *(Q->base + Q->front);
  Q->front = (Q->front +1 )%QUEUE_MAX_LEN;
  return OK;
}

/***********打印队列**********///事实上队列是不能这么用的//这里只是为了能看到先进先出的效果/****************************/
Status printQueue(sqQueue Q){
  if(isEmpty(Q))
    printf("queue is empty\n");

  int len = getLength(Q);

  while(Q.rear - Q.front){
    printf("[%d] ",*(Q.base+Q.front));
    Q.front = (Q.front+1)%QUEUE_MAX_LEN;
  }

  printf("\n");
  return OK;
}

int main(){
  char sel;
  int val;

  sqQueue Q;
  initQueue(&Q);

  while(1){
    system("clear");
    printf("\n");
    printQueue(Q);
    printf("e = enQueue\nd = deQueue\n");
    printf("g = getHead\n");
    printf("plese enter your choose[e|d|g]:");
    sel = getchar();

    if(sel == ‘e‘){
      printf("[EnQueue]enter value:");
      scanf("%d",&val);
      enQueue(&Q,val);
    }

    else if(sel == ‘d‘){
      deQueue(&Q,&val);
      printf("[DeQueue]value is %d\n",val);
      sleep(1);
    }

    else if(sel == ‘g‘){
      getHead(Q,&val);
      printf("[HeadVal]value is %d\n",val);
      sleep(1);
    }
  }
  return 0;
}

运行结果

时间: 2024-11-05 16:04:41

顺序队列代码的相关文章

java代码实现顺序队列

java实现顺序队列 package xianxinTable; import java.util.ArrayList; import java.util.Iterator; import com.sun.java_cup.internal.internal_error; public class queue_self<E> implements Iterator<E> { // 定义一个简单的迭代器 public iterator itertor(){ return new it

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

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

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

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

一步两步学算法之顺序队列

顺序链表代码  非常简单: 但这个代码会有假溢出的状况出现: 就是在队尾已满的情况下,不断出队后 若在此时进行入队操作 判断队列已满的条件是q->head==q->tail 此时这个条件满足. 但实际队列之前已经出队了好几个,前面还有空余空间,这就是假溢出:(原谅我懒得画图) 假溢出解决办法 1.每次出队后 把所有数据都往前移.这种方法要移动大量数据,效率太低. 2.使用循环队列.这种方法明天再打. 1 #define QUEUEMAX 15 2 typedef struct 3 { 4 DA

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

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

队列的实现:顺序队列

队列也是一种常见的线性表,它和栈相比有以下不同: 队列可以在表的两端进行操作.栈只能在栈顶进行插入和删除. 两端允许操作的类型不一样:可以进行删除的一端称为队头,这种操作也叫出队:可以进行插入的一端称为队尾,这种操作也叫入队.总的来说,队头只能出队,队尾只能入队. 队列的示意图: 模拟队列这种数据结构并不是什么难事,但会遇到一些问题,如: 假溢出 队列中明明还有空间,却因为rear已经指向最后,造成无法入队问题,这是假溢出. 解决办法是:使用链式存储,这显然可以.在顺序存储时,我们常见的解决办法

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和

11. C#数据结构与算法 -- 顺序队列

理论基础: 队列(Queue)是插入操作限定在表的尾部而其它操作限定在表的头部进行的线性表.把进行插入操作的表尾称为队尾(Rear),把进行其它操作的头部称为队头(Front). 对列的操作是按照先进先出(First In First Out)或后进后出( Last In Last Out)的原则进行的,因此,队列又称为FIFO表或LILO表. 与栈一样,队列的运算是定义在逻辑结构层次上的,而运算的具体实现是建立在物理存储结构层次上的.因此,把队列的操作作为逻辑结构的一部分,每个操作的具体实现只

队列:顺序队列和循环队列

和栈的先进后出不同,队列的形式是先进先出,队列的想法来自于生活中排队的策略, 顾客在付款结账的时候,按照到来的先后顺序排队结账.先来的顾客先结账,后来的顾客后结账. 队列有两种实现形式:1 顺序表实现 2 循环顺序表 首先来看下顺序表的实现,在python中,队列的实现用list来写十分的方便.实现方式如下: class line_queue(): def __init__(self): self._elem=[] def push(self,elem): self._elem.append(e