循环队列的总结

#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;
}




















猜你喜欢

转载自zhangmingwei.iteye.com/blog/1773740