队列

xiaoxiao2022-06-11  22

队列

/* *author:zylg project:sequeue * sequeue 主要是进行先进先出,那就有进队出队操作,最主要的功能也就实现这两个. * 队列的基本原理:rear端进行入队,font进行出队 * 五个基本操作 * setNullSq()置空 * emptySq()判断是否空 * frontSq()取头元素 * pushSq()进队 * popSq()出队 * */ #include<stdlib.h> #include <iostream> #include<string> #include<iomanip> using namespace std; typedef int datatype; #define maxsize 60 typedef struct { datatype data[maxsize]; int font, rear; }sequeue; void dispalySq(sequeue *s)//指针传递,值会发生改变,所以想办法保证font和rear不变 { int f=s->font; int r=s->rear; while (s->font!=s->rear) { cout<<s->data[(s->font+1)%maxsize]<<"\t"; s->font=(s->font+1)%maxsize; } s->font=f; s->rear=r; } int emptySq(sequeue *s) { if (s->font == s->rear) { return 1; } else { return 0; } } void setNullSq(sequeue *s) { s->font = maxsize - 1; s->rear = maxsize - 1; } datatype frontSq(sequeue *s) { if (emptySq(s)) { printf("queue is empty.\n"); } else { return (s->font + 1) % maxsize; } } int pushSq(sequeue* s, datatype x) { if (s->font ==((s->rear+1) % maxsize)) { printf("queue overflow\n");return 0; } else { s->rear = (s->rear + 1) % maxsize;//if的判断语句的作用,导致了长度减一 s->data[s->rear] = x; return 1; } } datatype popSq(sequeue *s) { if (emptySq(s)) { printf("queue is empty.\n");return 0; } else { s->font = (s->font + 1) % maxsize; return s->data[s->font];} } int main() { sequeue s; setNullSq(&s); if(emptySq(&s))cout<<"队列创建成功\n"; for(int i=0;i<30;i++) { if(!pushSq(&s,i))cout<<"进队发生错误\n"; } dispalySq(&s); for(int i=0;i<30;i++) { cout<<popSq(&s); } return 0; } #include<stdio.h> #include<stdlib.h> typedef int datatype; #define maxsize 60 typedef struct { datatype data[maxsize]; int font, rear; }sequeue; int empty(sequeue *s) { if (s->font == s->rear) { return 1; } else { return 0; } } void setnull(sequeue *s) { s->font = maxsize - 1; s->rear = maxsize - 1; } datatype front(sequeue *s) { if (empty(s)) { printf("queue is empty.\n"); } else { return (s->font + 1) % maxsize; } } int enqueue(sequeue* s, datatype x) { if (s->font ==((s->rear+1) % maxsize)) { printf("queue overflow\n");return 0; } else { s->rear = (s->rear + 1) % maxsize;//if的判断语句的作用,导致了长度减一 s->data[s->rear] = x; return 1; } } void dequeue(sequeue *s) { if (empty(s)) { printf("queue is empty.\n"); } else { s->font = (s->font + 1) % maxsize; } } void print(sequeue *s) //必须保证队列的起始和结束不会发生任何改变的输出 { sequeue *p; int f, e; f = s->font; e = s->rear; p = s; while (1) { if (p->font != p->rear) { printf("\tfont=%d -\n",(p->font+1)%maxsize, p->data[(p->font+1)%maxsize]); s->font=(s->font+1)%maxsize; } else { putchar(10);break; } } s->font = f; s->rear = e; } void main() { sequeue s = { {1,2,3,4,5,6},{0},{5} }; system("color 0a"); setnull(&s); for (int i = 0;i < 60;i++) { enqueue(&s, i); dequeue(&s); } print(&s); }

链队列

/* *author:zylg project:link linkqueue * linkqueue 主要是进行先进先出,那就有进队出队操作,最主要的功能也就实现这两个. * 队列的基本原理:rear端进行入队,front进行出队,刚开始时候rear和front都会在一直地址里面,一般这个地址浪费了,不存data * rear和font同时操作一个内存,他们只是存数据后地址发生改变了,一个去前面的地址,一个还在后面。 * 五个基本操作 * setNullSq()置空 * emptySq()判断是否空 * frontSq()取头元素 * pushSq()进队 * popSq()出队 * */ #include<stdlib.h> #include <iostream> #include<string> #include<iomanip> using namespace std; typedef int datatype; typedef struct linklist { datatype data; struct linklist *rear,*front,*next; }linkqueue; void dispalySq(linkqueue *s) { s=s->front->next; while (s=NULL) { cout<<s->front->next->data; s=s->next; } } int emptySq(linkqueue *s) { return s->front == s->rear?1:0; } linkqueue* setNullSq(linkqueue *s) { s=(linkqueue *)malloc(sizeof(linkqueue)); //这个空间被浪费来只装指针了,这样方便计算; s->front=(linkqueue *)malloc(sizeof(linkqueue)); s->next=NULL; s->rear=s->front; s->front->next=NULL; s->front->front=NULL; s->front->rear=NULL; return s; } datatype frontSq(linkqueue *s) { if (emptySq(s)) { printf("queue is empty.\n"); return 0;} else { return s->front->next->data; } } int pushSq(linkqueue* s, datatype x) { s->rear->next = (linkqueue*)malloc(sizeof(linkqueue)); s->rear=s->rear->next; s->rear->data=x; s->rear->next=NULL; return s->rear->next==NULL?1:0; } datatype popSq(linkqueue *s) { if (emptySq(s)) { printf("queue is empty.\n");return 0; } else { linklist *temp=s->front->next; s->front->next=s->front->next->next; datatype data=temp->data; free(temp); return data; } } int main() { linkqueue *s; s=setNullSq(s); if(emptySq(s))cout<<"队列创建成功\n"; for(int i=0;i<10;i++) { pushSq(s,i); } dispalySq(s); for(int i=0;i<10;i++) { cout<<popSq(s); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-4931425.html

最新回复(0)