队列
/*
*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 %2d\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;
}