队列

循环队列

#include<stdio.h>

#include<stdlib.h>

#defineFALSE0

#defineTRUE1

typedef_BoolBOOL;

typedefintElemType;

//循环队列结构体定义

typedefstruct

{

        intfront;                            //对头

        intrear;                             //队尾

        intmaxSize;                  //允许存储的最大空间数量

        ElemType*element;            //element表示一维数组首地址指针

}Queue;

//创建一个能容纳mSize个单元的空队列

voidcreate(Queue*Q,intmSize)

{

        Q->maxSize =mSize;

        Q->element = (ElemType*)malloc(sizeof(ElemType)*mSize);

        Q->front =Q->rear = 0;

}

//销毁一个已存在的队列,即释放队列占用的数组空间

voidDestroy(Queue*Q)

{

        Q->maxSize = -1;

        free(Q->element);

        Q->front =Q->rear = -1;

}

//判断队列是否为空,若是,则返回TRUE,否则返回FALSE

BOOLIsEmpty(Queue*Q)

{

        return  Q->front ==Q->rear;

}

//判断队列是否已满,若是,则返回TRUE,否则返回FALSE

BOOLIsFULL(Queue*Q)

{

        return(Q->rear + 1) %Q->maxSize ==Q->front;

}

//获取队头元素,并通过x返回。若是,则返回TRUE,否则返回FALSE

BOOLFront(Queue*Q,ElemType*x)

{

        if(IsEmpty(Q))

               returnFALSE;                         //空列处理

        *x=Q->element[(Q->front + 1) %Q->maxSize];

        returnTRUE;

}

//在队列Q的队尾插入元素x(入栈操作)。操作成功,则返回TRUE,否则返回FALSE

BOOLEnQueue(Queue*Q,ElemTypex)

{

        if(IsFULL(Q))

               returnFALSE;                         //溢出列处理

        Q->rear = (Q->rear + 1) %Q->maxSize;

        Q->element[Q->rear] =x;

        returnTRUE;

}

//从队列Q中删除队头元素x(出栈操作)。操作成功,则返回TRUE,否则返回FALSE

BOOLDeQueue(Queue*Q)

{

        if(IsEmpty(Q))

               returnFALSE;                         //空队列处理

        Q->front = (Q->front + 1) %Q->maxSize;

        returnTRUE;

}

//清除队列中的全部元素,但并不释放空间。

voidClear(Queue*Q)

{

        Q->front =Q->rear = 0;

}

/*

int output(Queue *Q)

{

        int x;

        if (IsEmpty(Q))

               return FALSE;

        while (!IsEmpty(Q))

        {

               Front(&Q, &x); //获取队头元素,并通过x返回。

               DeQueue(&Q);           //从队列Q中删除队头元素x

               printf("%d", x);

        }

        return TRUE;

}

void main()

{

        Queue *Q = new Queue();

        int i,j,x;

        create(Q, 10);

        printf("请输入要插入队中的元素:\n");

        for (i = 0; i < 9; i++)

        {

               scanf_s("%d", &j);

               EnQueue(Q, j);                //在队列Q的队尾插入元素i

        }

        printf("循环队列的元素:");

        output(Q);

        printf("\n");

        Destroy(Q);

}

*/

intoutput(QueueQ)

{

        intx;

        if(IsEmpty(&Q))

               returnFALSE;


        while(!IsEmpty(&Q))

        {

               Front(&Q, &x); //获取队头元素,并通过x返回。

               DeQueue(&Q);           //从队列Q中删除队头元素x

               printf("%d", x);

        }

        returnTRUE;

}

voidmain()

{

        QueueQ;

        inti,x;

        create(&Q, 10);

        for(i = 0; i < 9; i++)

               EnQueue(&Q, i);                       //在队列Q的队尾插入元素i

        printf("循环队列的元素:");

        output(Q);

        printf("\n循环队列的队顶元素:");

        Front(&Q, &x);

        printf("%d", x);

        printf("\n删除一个栈顶元素的循环队列的元素:");

        DeQueue(&Q);

        output(Q);

        printf("\n");

        Destroy(&Q);

}


//链式队列(先进先出,后进后出)队尾进队、队头出队

#include<stdio.h>

#include<stdlib.h>

#defineERROR0

#defineOK1

typedefintElemType;

typedefstructNode{

        ElemTypeElement;             //数据域

        structNode*link;            //指针域

}Node;

typedefstruct{

        structNode*front;           //队头指针

        structNode*rear;            //队尾指针

        intn;

}LinkQueue;

//初始化(创建)

intInit(LinkQueue*q){

        q->rear =NULL;

        q->front =NULL;

        q->n = 0;

        returnOK;

}

//销毁一个已存在的队列,即释放队列占用的数组空间

voidDestroy(LinkQueue*q){


}

//判断队列是否为空,若是,则返回OK,否则返回ERROR

intIsEmpty(LinkQueue*q){

        returnq->n==0;

}

//获取队头元素,并通过x返回。若是,则返回OK,否则返回ERROR

intFront(LinkQueue*q,ElemType*x){

        if(IsEmpty(q))

               returnERROR;

        *x=q->front->Element;

        returnOK;

}

//在队列Q的队尾插入元素x(入栈操作)。操作成功,则返回OK,否则返回ERROR

intEnQueue(LinkQueue*q,ElemTypex){

        Node*p;

        p = (Node*)malloc(sizeof(Node));             //申请新结点空间

        if(p !=NULL){               

               p->Element =x;               

               p->link =NULL;

               if(q->front ==NULL){

                       q->front = p;                         //插入的是空队

               }

               else

               {

                       q->rear->link = p;

               }

               q->rear = p;

               q->n++;

        }

        returnOK;

}

//从队列Q中删除队头元素x(出栈操作)。操作成功,则返回OK,否则返回ERROR

intDeQueue(LinkQueue*q){

        Node*p ;

        if(IsEmpty(q))

               returnERROR;

        p =q->front;                         //修改队头指针

        q->front = p->link;           

        free(p);                                     //释放已经删除结点空间

        q->n--;

        returnOK;

}

//清除堆栈中的所有元素,但不释放空间

voidClear(LinkQueue*q){

        q->front =q->rear =NULL;

}

//输出

intoutput(LinkQueueq){

        intx;

        if(IsEmpty(&q))

               returnERROR;

        while(!IsEmpty(&q)){

               Front(&q, &x);

               DeQueue(&q);

               printf("%d", x);

        }

        returnOK;

}

intmain(){

        inti;

        LinkQueueq;

        Init(&q);

        for(i = 0; i < 10; i++)

               EnQueue(&q, i);                       //在队列Q的队尾插入元素i

        printf("链式队列的元素:");

        output(q);

        Destroy(&q);

        printf("\n");

}

优先权队列

#include<stdio.h>

#include<stdlib.h>

#define Error(str) FatalError(str)

#define FatalError(str) fprintf(stderr,"%s\n",str),exit(1)

#define MinPQSize (10)

#define MinData (-32767)

typedef int ElemType;

struct Heapstruct

{

int Capacity;

int Size;

ElemType *Elements;

};

typedef struct Heapstruct *PriorityQueue;

//构造一棵空的优先队列

PriorityQueue Initialize(int MaxNumber)

{

PriorityQueue H;

if (MaxNumber < MinPQSize) //如果队列最大空间小于

Error("Priority queue size is too small!");

H = (PriorityQueue)malloc(sizeof(struct Heapstruct));

if (H == NULL)

FatalError("out of space !");

//分配数组空间,加上一个哨兵的空间

H->Elements = (ElemType*)malloc((MaxNumber + 1)*sizeof(ElemType));

if (H->Elements == NULL)

FatalError("out of space !");

H->Capacity = MaxNumber;

H->Size = 0;

H->Elements[0] = MinData;

return H;

}

//H->Elements[0]是一个哨兵

//判断优先队列是否为空

int IsEmpty(PriorityQueue H)

{

return H->Size == 0;

}

//查找优先队列的最小值

ElemType FindMin(PriorityQueue H)

{

if (!IsEmpty(H))

return H->Elements[1];

Error("Priority queue is empty !");

return H->Elements[0];

}

//判断优先队列是否为满

int IsFull(PriorityQueue H)

{

return H->Size == H->Capacity;

}

//销毁优先队列

void Destroy(PriorityQueue H)

{

free(H->Elements);

free(H);

}

//插入元素

void Insert(ElemType x, PriorityQueue H)

{

int i;

if (IsFull(H))

{

Error("Priority queue is full");

return;

}

for (i = ++H->Size; H->Elements[i / 2] > x; i /= 2)

//插入新元素向上调整建堆

H->Elements[i] = H->Elements[i / 2];

//直到找到位置

H->Elements[i] = x;

}

//删除优先队列最小值

ElemType DeleteMin(PriorityQueue H)

{

int i, Child;

ElemType minElenent, lastElement;

if (IsEmpty(H))

{

Error("Priority queue is empty !");

return H->Elements[0];

}

minElenent = H->Elements[1];

lastElement = H->Elements[H->Size--];

for (i = 1; i * 2 <= H->Size; i = Child)

{

//找最小的元素

Child = i * 2;

if (Child != H->Size && H->Elements[Child + 1] < H->Elements[Child])

Child++;

if (lastElement>H->Elements[Child])

H->Elements[i] = H->Elements[Child];

else

break;

}

H->Elements[i] = lastElement;

return minElenent;

}

//创建空的优先队列

void MakeEmpty(PriorityQueue H)

{

H->Size = 0;

}

int main()

{

PriorityQueue H = Initialize(20);

int ar[] = { 35, 24, 15, 22, 38, 18, 62, 60, 20, 11 };

int i;

for (i = 0; i < 10; i++)

Insert(ar[i], H);

for (i = 0; i < 10; i++)

printf("%d\n", DeleteMin(H));

return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343