循环队列(0965)

p { margin-bottom: 0.25cm; line-height: 120% }

描述

根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值。要求采用顺序队列完成,少用一个存储空间的方法区分队列的空和满。

input

输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数。 第二行为操作次k,接下来k行为出队入队操作,每行各代表一次操作。入队用in表示,出队用out表示,如果是入队,则in隔一空格后为一整数,表示入队元素值。

output

输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。可以假定队在完成所有操作后不为空。

样例输入

4

7

in 1

in 2

in 5

in 6

out

out

in 8

样例输出

5 8

这道题如题所示,建立一个循环队列就做了

代码如下

#include<iostream>

#include<string>

using namespace std;

int n;

typedef struct queue{

    int data[50];

    int head,tail;

}queue,*Queue;

void init(Queue queue){

    queue->head=queue->tail=0;

}

bool isEmpty(Queue queue){

    return queue->head==queue->tail;

}

bool isFull(Queue queue){

    return (queue->tail+1)%n==queue->head;

}

void in(Queue queue){

    int num;cin>>num;

    if(isFull(queue))return;

    queue->data[queue->tail++]=num;

    queue->tail=queue->tail%n;

}

int out(Queue queue,int &e){

    if(queue->head==queue->tail)return 0;  

    e=queue->data[queue->head];

    queue->head=(queue->head+1)%n;  

    return 1;  

}  

int main(){

    int t;

    queue queue;

    init(&queue);

    cin>>n>>t;

    string str;

    int num;

    int e=1;

    for(int i=0;i<t;i++){

        cin>>str;

        if(str=="in"){

            in(&queue);

        }

        else if(str=="out")num=out(&queue,e);

    }

    while(out(&queue,e)){

        cout<<e<<" ";

    }

    return 0;

}

时间: 2024-10-07 15:46:36

循环队列(0965)的相关文章

数据结构之循环队列c语言实现

    队列是一种先入先出的结构,数据从队列头出,队尾进.在linux内核中进程调度,打印缓冲区都有用到队列.     队列有多种实现方式,可以用链表,也可以用数组.这里用数组来实现一个简单的循环队列.首先创建一个大小为8的队列如下,队列头尾指针指向同一块内存,          当从队列尾部插入一个数据后变成下面的情形,为了便于处理,这里始终会浪费一个空间 继续插入数据,直到出现以下情形,表示队列满了, 接下来看一下出队的情形,从队列头出队3个元素, 再添加三个元素后队列又变成满的了, 在上面

47 _ 循环队列程序演示.swf

通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h> #include <stdio.h> #include <stdlib.h> typedef struct Queue{ int * data;//存储的数据,指向一个数组 int font ;//队列数据删除 int rear;//队列数据的添加 }QUEUE ,*PQUEUE

多线程与循环队列

多线程使用循环队列其实也不是个很难的东西,在工作中遇到了一个队列行为非常古怪,怎么也想不通,一直都没有认证对待这些,有点怵,所以这回想认真对待一下. 多线程使用循环队列主要就是要避免两个线程同时操作队列,加个锁就可以很容易的实现,win32中用临界区就可以做到. 代码: // CirQueue.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Wi

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

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

每日一题19:循环队列

基于数组实现的循环队列,这个比基于链表实现的稍微麻烦一点,需要浪费一个存储空间.如果全部利用,则编程将会变得更加繁琐,并且更容易出错. // LoopQueue.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; struct loop_queue { int capacity; int head; int tail; int *vals; }; loop_

(一)循环队列

队列可以使用数组或者链表实现,这里介绍一种使用数组实现的循环队列. 所谓循环队列,是指当尾指针超过数组索引界限时,通过取余运算返回数组起始端,只要保证尾指针和头指针不相遇,就可以继续存储元素. 首先设定队列的大小,并建立队列结构体: #define MAXSIZE 100001 typedef struct { int items[MAXSIZE]; int front; int rear; }Queue; 设头指针和尾指针指向同一索引时队列为空,起始时均在索引0处. void initQueu

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

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

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

09.循环队列与链队列

一.队列与循环队列 1.队列 (1)队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(Fiirst In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头. 从队列的定义可知,队列的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1).队列的删除操作,与栈不同的是,队列元素的出列是在队头,即小标为0的位置,若要删除一个元素的话,需要移动队列的所有元素,因此事件复杂度为O(n).