队列(顺序)

顺序队列是一段连续的地址,但是存在假溢出情况,所以要用循环队列来实现,具体操作像钟表

下面是顺序队列的表示与实现:

#include <iostream>
using namespace std;
//顺序循环队列的基本表示和实现

const int MAX_SIZE = 100;//定义队列长度
struct SqQueue
{
    int * base;
    int front ;
    int rear;
};
//初始化队列 注意队尾队首指针的初始化
bool InitQueue(SqQueue &sq)
{
    sq.base=(int*)malloc(sizeof(int));
    if (!sq.base)
    {
        return false;
    }
    sq.front=sq.rear=0;
    cout<<"Initial Queue Successfully!"<<endl;
    return true;
}
//返回队列的长度
int QueueLength(SqQueue &sq)
{
    return (sq.rear-sq.front+MAX_SIZE)%(MAX_SIZE);
}

//插入元素e为 队列的队尾元素
bool EnQueue(SqQueue &sq,int e)
{
    if ((sq.rear+1)%(MAX_SIZE)==sq.front)//循环队列 判断队列是否满了
    {
        cout<<"sorry ,overflow"<<endl;
        return false;
    }
    sq.base[sq.rear]=e;
    sq.rear=(sq.rear+1)%MAX_SIZE;//如果钟表走到12点 下一个将走到1点
    return true;
}

//删除队首元素 用e返回
bool DeQueue(SqQueue &sq,int &e)
{
    if (sq.front==sq.rear)//判断队列是否为空
    {
        cout<<"Sorry,the queue is empty"<<endl;
        return false;
    }
    e=sq.base[sq.front];
    sq.front=(sq.front+1)%MAX_SIZE;
    return true;
}

//打印队列
void PrintQueue(const SqQueue sq)
{
    if (sq.rear==sq.front)
    {
        cout<<"Sorry,the queue is empty"<<endl;
        return;
    }
    cout<<"Now print the new queue:"<<endl;
    int index=0;
    index=sq.front;
    while (index!=sq.rear)
    {
        cout<<sq.base[index]<<endl;
        index=(index+1)%MAX_SIZE;
    }
}

void main()
{
    SqQueue sq={0};
    InitQueue(sq);
    int ElemNum=0;
    cout<<"请输入要插入元素的个数:";
    cin>>ElemNum;
    int Elem=0;
    for (int i=0;i<ElemNum;i++)
    {
        cout<<"请输入要插入第 "<<i+1<<" 个元素:";
        cin>>Elem;
        if (EnQueue(sq,Elem))
        {
            cout<<"插入成功"<<endl;;
        }
    }
    PrintQueue(sq);//打印队列
    int delnum;
    DeQueue(sq,delnum);//删除第一个元素
    cout<<"the delete num is :"<<delnum<<endl;
    PrintQueue(sq);//打印队列
    DeQueue(sq,delnum);
    DeQueue(sq,delnum);
    PrintQueue(sq);//打印队列
}

结果如下图所示:

队列(顺序)

时间: 2024-11-07 20:40:38

队列(顺序)的相关文章

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

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

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

链式队列 + 顺序队列 + 顺序循环队列

#include <stdio.h> #include <stdlib.h> #define OK 1 #define FALSE 0 #define ERROR -1 typedef int Status; typedef int QElemType; typedef struct QNode { QElemType data; QNode *next; }*QueuePtr; struct LinkQueue { QueuePtr front,rear;//队头,队尾指针 };

数据结构-队列-顺序链式存储

定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队. 队列的操作 队列不可以读取对中间的元素. 队列的存储结构 顺序存储 链式存储 顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front 和rear分别指示队头元素和队尾元素的位置. 设队头指针指向队头元素,队尾指针指向队尾 元素的下一个位置(也可以让rear指向队尾元素,front指向队头元

顺序队列总结

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

顺序结构栈与队列之货物货架管理

#include <iostream>#include<string.h> using namespace std; static int n;       //货架(栈)的最大容量 //信息结构体typedef struct /*Inform*/      //可以去掉Inform,在需要在结构体中定义结构体对象(指针)时不能去掉{    string name;    int a;}Inform; //栈的*顺序*结构体typedef struct{    Inform *ba

剑指 | 7-利用两个栈构建一个队列

题目描述:http://ac.jobdu.com/problem.php?pid=1512 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解析: 定义2个栈s1, s2 1. 开始时,将元素push进s1 2. front()或pop()时,将s1的数据,出栈,顺序压入s2; 此时发现 s2 的出栈顺序即队列的出队列顺序. 3. 再次push时,仍然 push 进 s1 4. front()或pop()时,如果 s2 为空,则将 s1 的所有数据压入 s2

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型   队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out).我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列

POJ 2823 Sliding Window(单调队列)

[题目链接] http://poj.org/problem?id=2823 [题目大意] 给出一个数列,问每k个数总最小值和最大值分别是多少 [题解] 单调队列顺序维护需求,时间节点超过k的点就出队 我们维护两次单调队列,用xor的小trick可以降低码量. [代码] #include <cstdio> #include <algorithm> using namespace std; const int MAX_N=1000010; int n,k; int a[MAX_N],b