首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

循环行列的总结

2013-01-26 
循环队列的总结#if 0NSString *tempStr[NSString stringWithFormat:@北京,你好]NSString *strUTF[tem

循环队列的总结

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




















热点排行