但行好事,莫问前程

队列

队列

/*
 *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;
}








posted @ 2018-10-15 14:33  专业路过  阅读(107)  评论(0编辑  收藏  举报