#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
今日推荐
周排行