`
zjjzmw1
  • 浏览: 1368959 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

循环队列的总结

    博客分类:
  • iOS
阅读更多

#if 0
NSString *tempStr=[NSString stringWithFormat:@"北京,你好"];
NSString *strUTF=[tempStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",strUTF);
NSString *strGBK=[strUTF stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",strGBK);


问题一. 请实现一个顺序循环队列, 要求如下:
1. 队列有一个表头, 和一个表尾。
2. 队列的最大长度为N, N为一个预先定义好的数值
3. 要求实现如下方法:
a) push方法, 表示向表尾插入一个元素
b) front方法, 返回表头的元素
c) pop方法, 删除表头的元素
d) isInList方法, 判断一个元素是否在队列中
e) remove方法, 从队列中删除某个值的元素
f) length方法, 返回队列的实际长度
g) empty方法, 如果队列为空,则返回真, 否则返回假
首先定义一个数组表示一个循环队列。设置最大长度为n,实际队列的表头下标head  表尾下标为tail    初始化head=0,tail=0; 用a[n]={0}表示循环队列。

push方法:  添加一个元素temp;先判断length如果length<n则 a[tail%n]=temp;tail++;否则a[tail%n]=temp;tail++;     a[head%n]=0;head++;
front方法:先判断是否为空,如果为空提示一句话,否则返回a[head%n];
pop方法:先判断是否为空,如果为空提示一句话,否则a[head%n]=0;head++;
isInList方法:先判断是否为空,如果为空提示一句话,否则用for循环,(i=0,i<length;++i),判断是否和(head+i)%n相同 ,如果相同则返回1,否则返回0;
remove方法:先判断是否为空,如果为空提示一句话,否则,再获取它的长度length,用for循环,(i=0,i<length;++i),判断是否和(head+i)%n相同 ,如果相同返回i的值,如果i的值小于length/2 则删除这个值的同时把前面的元素往后移动,移动用一个for循环,(j=i,j>0;j--),                      a[(head+j)%n]=a[(head+j-1)%n]; 最后在for循环外面把a[head%n]=0;否则把后面的值往前移动。如果没有相同的提示一句话。

length方法:返回tail-head;
empty方法:如果tail-head=0则为返回1;否则返回0;


#endif


#define MAX1 10
#import <Foundation/Foundation.h>

int a[MAX1];//定义数组a表示队列,MAX1为最大长度,初始数据全部为0;
int head=0;//初始化表头下标为0;
int tail=0;//初始化表尾下标为0;


int empty(int head,int tail);    //判断是否为空的方法。
int Length(int head,int tail);   //判断长度。
void push(int *b,int x);         //从表尾插入一个元素。
int front(int *b);               //返回表头的元素。
int pop(int *b);                 //删除表头的元素。
int isInList(int *b,int x);      //判断元素是否在队列中。
int remove1(int *b,int x);       //从队列中删除某个值的元素。




//判断是否为空;
int empty(int head,int tail){
    if (tail-head==0) {
        return 1;
    }
    return 0;
}
//判断长度:
int Length(int head,int tail){
    return tail-head;
}
//从表尾插入一个元素。
void push(int *b,int x){
    int tempLength=Length(head, tail);
    if (tempLength<MAX1) {
       a[tail%MAX1]=x;
        tail++;
    }
    else{
        a[tail%MAX1]=x;
        tail++;
        a[head%MAX1]=0;
        head++;
    } 
}
//返回表头的元素;
int front(int *b){
    int isEmpty=empty(head, tail);
    if (isEmpty) {
        printf("对不起此队列为空,无法返回\n");
        return 0;
    }
    else{
        return a[head%MAX1];
    }
}
//删除表头的元素。
int pop(int *b){
    int isEmpty=empty(head, tail);
    if (isEmpty) {
        printf("对不起此队列为空,不能删除\n");
        return 0;
    }
    else{
        a[head%MAX1]=0;
        head++;
        return 1;
    }
}
//判断元素是否在队列中。
int isInList(int *b,int x){
    int isEmpty=empty(head, tail);
    if (isEmpty) {
        printf("对不起此队列为空,元素不在这里\n");
        return 0;
    }
    else{
        int mylength=Length(head, tail);
        for (int i=0; i<mylength; i++) {
            if (a[(head+i)%MAX1]==x) {
                return 1;
            }
        }
        printf("对不起此队列为空,元素不在这里\n");
        return 0;
    }
   
}
//从队列中删除某个值的的元素
int remove1(int *b,int x){
    int isEmpty=empty(head, tail);
    if (isEmpty) {
        printf("对不起此队列为空,元素不在这里不用删除了\n");
        return 0;
    }
    else{
        int mylength=Length(head, tail);
        for (int i=0; i<mylength; i++) {
            if (a[(head+i)%MAX1]==x) {
                if (i<mylength/2) {//把前半部分往后移动。
                    for (int j=i; j>0; j--) {
                        a[(head+j)%MAX1]=a[(head+j-1)%MAX1]; 
                    }
                    a[head%MAX1]=0;//把移动后的第一个元素赋值为0;
                    head++;
                }
                else{//把后半部分往前移动。
                    for (int j=i; j<mylength; j++) {
                        a[(head+j)%MAX1]=a[(head+j+1)%MAX1]; 
                    }
                    a[tail%MAX1]=0;//把移动后的第一个元素赋值为0;
                    tail--;
                }
                return 1;
            }
        }
        printf("对不起此队列为空,元素不在这里不用删除了\n");
        return 0;
    }
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
       
       
       
        //判断是否为空;
        int isEmpty=empty(head,tail);
        if (isEmpty) {
            printf("此队列为空\n");
        }
        else{
            printf("此队列不为空\n");
        }
       
        //判断长度:
        int myLength=Length(head,tail);
        printf("此队列的长度为:%d\n",myLength);
       
        //向表尾插入一个数。
        int *b=a;
        push(b,5);
//        push(b,6);
        push(b,7);
//        push(b,8);
       
        //返回表头的元素
        int myfront=front(b);
        if (myfront) {
            printf("表头元素为a[%d]==%d\n",head%MAX1,myfront);
        }
        //删除表头的元素。
        int myPop=pop(b);
        if (myPop) {
            printf("删除成功\n");
        }
        //判断某个元素是否在队列中。
       int y=isInList(b, 7);
        if (y) {
            printf("该元素在队列中\n");
        }
        int z=remove1(b, 7);
        if (z) {
            printf("删除某个值成功\n");
        }
       
       
       
        //输出队列的元素。
        printf("\n下面是整个表的元素显示:\n");
        for (int i=head; i<tail; i++) {
            printf("a[%d]=%d\n",i%MAX1,a[i%MAX1]);
        }
        printf("head==%d,,tail===%d",head,tail);
    }
    return 0;
}




















1
1
分享到:
评论

相关推荐

    串口缓冲区 循环队列

    总结来说,串口缓冲区结合循环队列的设计,为STM32F103ZET6上的串口通信提供了一种高效、可靠的解决方案。通过合理地管理和操作循环队列,可以在保证数据完整性的同时,有效平衡数据的接收和处理速度,提升系统的...

    循环队列的基本操作和实现

    总结,循环队列是一种高效的数据结构,它的基本操作包括初始化、入队、出队以及判断队列状态。理解其工作原理和实现方式对于解决实际问题具有重要意义。在编程实践中,循环队列能够提供稳定、高效的队列操作,是许多...

    多线程与循环队列

    总结来说,多线程中的循环队列是一种强大的工具,它结合了多线程的并发优势和循环队列的高效特性,广泛应用于各种并发和多线程编程场景。在实际开发中,理解并熟练掌握这一技术,可以极大地提升程序的性能和可扩展性...

    简单的C语言循环队列

    总结来说,"简单的C语言循环队列"是一个基础的数据结构实验,它帮助我们理解如何在C语言环境中实现和操作循环队列,同时也为我们提供了在实际编程中处理数据流和队列操作的基础。通过这个实验,可以提升对数据结构和...

    C只有尾指针的循环队列(数据结构作业)

    ### C语言实现仅有尾指针的循环队列 在数据结构的学习过程中,循环队列是一种重要的数据结构之一,尤其在解决计算机系统中的缓冲问题时应用广泛。本篇将基于题目提供的部分代码,深入探讨如何使用C语言实现一个仅有...

    java循环队列的分析和实例介绍.pdf

    ### Java循环队列的深入解析与实践应用 #### 循环队列概念解析 循环队列,作为一种高效的数据结构,广泛应用于计算机科学中,尤其是在Java编程语言中,它以其独特的性能优势,在各种算法和系统设计中占据了...

    数据结构源码之线性循环队列

    ### 数据结构源码之线性循环队列 #### 概述 本文档旨在详细介绍线性循环队列的数据结构以及其实现方法。线性循环队列是一种特殊的队列形式,它利用数组来存储元素,并通过巧妙地调整队列的前端(front)和尾端(rear)...

    顺序循环队列的应用举例

    总结来说,顺序循环队列作为一种基础的数据结构,其在约瑟夫环问题中的应用充分展示了其灵活性和实用性。通过对队列的操作,我们可以高效地解决这个经典问题,理解并掌握这一算法有助于提升我们在面对类似问题时的...

    C#编写的顺序循环队列

    总结,C#中的顺序循环队列利用数组实现,通过维护队首和队尾指针进行元素的插入和删除。它的主要优点在于高效的空间利用率和简化了满队列和空队列的处理。通过理解其工作原理和基本操作,开发者可以在实际项目中灵活...

    循环队列C++ 实现方法

    总结来说,C++实现的循环队列是一个高效的数据结构,通过巧妙地处理索引来实现在有限空间内的“循环”操作,适用于需要快速插入和删除操作的场景。在实际应用中,循环队列常用于实现缓冲区、任务调度等。

    C#循环队列

    循环队列是一种线性数据结构,它...总结来说,C#中的循环队列是通过数组和索引管理来实现的,提供了高效的入队和出队操作。通过自定义类并结合测试,我们可以创建一个可靠的循环队列数据结构,满足各种应用程序的需求。

    数组实现循环队列(有bug版)

    ### 数组实现循环队列(有bug版) #### 概述 本文档主要介绍了一种基于数组实现的循环队列的代码实现,并对该代码进行了分析,指出了其中存在的问题及可能的原因。 #### 循环队列简介 循环队列是一种特殊的数据...

    8584 循环队列的基本操作

    在IT领域,循环队列(Circular Queue)是一种特殊的数据结构,它在数组中实现队列功能,通过将数组尾部与头部相连形成一个圆环,从而优化了队列的存储和操作效率。本文将深入探讨“8584 循环队列的基本操作”,解析...

    数据结构中循环队列的代码

    ### 数据结构中循环队列的代码解析 #### 一、循环队列简介 循环队列是一种特殊的队列,它的特点是将存储空间想象成一个首尾相接的圆环,这样可以使队列在有限的空间内更好地利用内存。在普通队列中,当队头元素出...

    C++循环队列模版(数组和链表两种实现方式都有)

    总结一下,C++中的循环队列可以通过数组和链表两种方式实现,每种实现都有其特点。数组实现访问速度快,但处理满队列和空队列需要特殊考虑;链表实现插入和删除操作灵活,但访问速度较慢。模板机制使得循环队列可以...

    循环队列求解约瑟夫环问题.zip

    总结起来,约瑟夫环问题的解决方法之一是采用循环队列,利用其环形特性高效地处理报数和移除元素的过程。C语言源代码提供了实践这一方法的具体实现,对于学习者来说是一份宝贵的参考资料。通过深入理解和实践,不仅...

    c++循环队列

    总结来说,C++中的循环队列是一种高效的数据结构,其主要优势在于它可以避免传统队列在满或空时需要进行数组扩容或缩容的操作,从而提高了程序运行的效率。通过合理的编程实现,循环队列可以为各种应用场景提供强大...

    数据结构C语言版_循环队列

    ### 数据结构C语言版_循环队列 #### 知识点概述 本篇文章将围绕“循环队列”这一数据结构进行详细的介绍与分析。在计算机科学领域,队列是一种非常重要的线性数据结构,它遵循先进先出(FIFO)的原则。而循环队列...

    实验项目:栈、循环队列的应用

    ### 实验项目:栈、循环队列的应用...此外,通过对实验过程中遇到的问题进行总结,也进一步加深了对栈和循环队列特性的理解。 总之,本次实验不仅加深了对栈和循环队列的理解,还提高了编程实践能力和解决问题的能力。

Global site tag (gtag.js) - Google Analytics