数据结构与算法整理5——队列(C语言)

  

 数据结构与算法整理5——队列(C语言)

目录

 数据结构与算法整理5——队列(C语言)

1、队列的基本概念与特点

2、队列的两种存储结构的基本操作,队空,队满,环形队列,假溢出


1、队列的基本概念与特点

1.1队列的特点:先进先出(FIFO)可看做排队买冰淇淋,只能对队头和队尾进行操作

1.2存储方式顺序存储和链式存储(注意front和rear的位置)

(队列的顺序存储)

(队列的链式存储)

1.3 队列的假溢出问题

   队列中因为多次出队入队而导致的存储空间不足的问题——解决办法:循环队列

front+1==[front+1]%maxsize;

 

2、队列的两种存储结构的基本操作,队空,队满,环形队列,假溢出

队列的操作

循环队列

链式队列

定义数据类型

Typedef struct{

Int queue[maxsize];

Int rear,front,count;

}seqrencequeue;

定义节点类型

Typedef struct qnode{

Int data;

Struct qnode *next;

}linkedqueuenode;

定义队列的结构体

Typedef struct{

Linkedqueuenode *front;

Linkedqueuenode *front;

}Lqueue;

判空与判满

方法一:使用count记录元素个数

队列已满count>0&&rear==front;

或count==maxsize;

队列已空count==0;

方法二:加设标志位出队时置0入队时置1

队列已满:tag==1 && rear==front

队列已空:tag==0 && rear==front

方法三:用掉一个存储单元(默认)

队列已满:

front==(rear+1)%MaxQueueSize

队列已空:rear==front

 

If(Q.front==null)

   Printf(“”queue is empty);

 

链式队列不会满

入队(在队尾入队)

Seqrencequeue Q;

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

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

 

P=(linkedqueuenode *)malloc(sizeof(linkedqueuenode))

Q->rear=p;

p->next=null;

出队(在队头出队)

*d=Q->queue[Q->front];

Q->front=[Q->front+1]%maxsize;

P=Q->front;

Q->front=Q->front->next;

Free(p;)

取队头元素

*d=Q->queue[Q->front];

*d=Q.front->data;

队列的应用举例(CPU对资源的管理,图的广度周游等,树的层次周游)

 

3、几个例题

(2)写算法:从把一个队列中的元素存储到栈。将一个栈中的元素放于队列中的算法(写算法要求会写程序,核心语句一定要会)(可以直接调用push pop操作)

把队列中的元素存到栈中:

(1)新建队列与栈并赋值:       Q=createEmptyQueue_seq();//队列     S= createEmptyStack_seq();//

2)取队头:          n=frontQueue_seq(Q);

3)将队头入栈顶:push_seq( S, n );

4)出队:              popQueue_seq(Q);

 

把栈中的元素存到队列中:

1)取出栈顶:         n=top_seq( S);

2)将栈顶入队尾:pushQueue_seq(Q,n);

3)出栈:                 popStack_seq(S);

 

4、队列的操作(C语言)

(1)队列的链式存储操作:

/*队列链接表示:函数定义*/

#include<stdio.h>
#include<stdlib.h>

typedef int DataType;
struct  Node;
typedef  struct Node *PNode;

struct  Node { 		/* 结点结构 */
    DataType    info;
    PNode       link;
};

struct  LinkQueue {	/* 链接队列类型定义 */	
    PNode  f;  		/* 头指针 */
    PNode  r;  		/* 尾指针 */
};

typedef struct LinkQueue *PLinkQueue;

/*创建一个空队列*/
PLinkQueue  createEmptyQueue_link() { 	
    PLinkQueue plqu = (PLinkQueue )malloc(sizeof(struct LinkQueue));
    if (plqu != NULL)
        plqu->f = plqu->r = NULL;
    else
        printf("Out of space!! \n");
  		
    return (plqu);
}

/*判断链接表示队列是否为空队列*/ 
int  isEmptyQueue_link( PLinkQueue plqu ) {
    return (plqu->f == NULL);
}


/*进队列*/
void  enQueue_link( PLinkQueue plqu, DataType x) { 
    PNode p = (PNode )malloc( sizeof( struct Node ) );
    if ( p == NULL  )
        printf("Out of space!");
    else { 
        p->info = x;
        p->link = NULL;
        if (plqu->f == NULL)
            plqu->f = p;
        else
            plqu->r->link = p;

        plqu->r = p;
    }
}

/*出队列*/
void  deQueue_link( PLinkQueue plqu ) { 
    PNode   p;
    if( plqu->f == NULL )
        printf( "Empty queue.\n " );
    else { 
        p = plqu->f;
        plqu->f = plqu->f->link;
        free(p);
    }
}

/* 在非空队列中求队头元素 */
DataType  frontQueue_link( PLinkQueue plqu ) { 
    return (plqu->f->info);
}


main()
{
	PLinkQueue  A;
	int i;
	A=createEmptyQueue_link();
	for(i=0;i<3;i++)
	{enQueue_link(A, i+1);
	}
	
	while(!isEmptyQueue_link(A))
	{printf("%d", frontQueue_link(A));
		deQueue_link(A);
	
	}
}

(2)队列的顺序存储操作:

/* 队列的顺序表示:函数定义 循环存储*/
#include <stdio.h>
#include <stdlib.h>

/* 队列的顺序表示:类型和函数声明 */

typedef int DataType;
#define MAXNUM 20  /* 队列中最大元素个数 */

struct  SeqQueue {	/* 顺序队列类型定义 */
    int f, r;
    DataType q[MAXNUM];
};

typedef struct SeqQueue *PSeqQueue;	/* 顺序队列类型的指针类型 */


/*创建一个空队列*/
PSeqQueue  createEmptyQueue_seq( void ) {  
    PSeqQueue paqu = (PSeqQueue)malloc(sizeof(struct SeqQueue));
    if (paqu==NULL)
        printf("Out of space!! \n");
    else
        paqu->f = paqu->r = 0;   //令头指针f和尾指针r都为0 
    return paqu;                 //返回队列 
}

/*判队列是否为空队列*/
int  isEmptyQueue_seq( PSeqQueue paqu ) {
    return paqu->f == paqu->r;          //如果  paqu->f == paqu->r则队列是空与下面的 paqu->r = (paqu->r + 1) % MAXNUM 表示队列已满相区别 
}

/* 在队列中插入一元素x */
void  enQueue_seq( PSeqQueue paqu, DataType x ) {
    if( (paqu->r + 1) % MAXNUM == paqu->f  )
        printf( "Full queue.\n" );
    else {
        paqu->q[paqu->r] = x;
        paqu->r = (paqu->r + 1) % MAXNUM;
    }
}

/* 删除队列头部元素 */
void  deQueue_seq( PSeqQueue paqu ) {
    if( paqu->f == paqu->r )
        printf( "Empty Queue.\n" );
    else
        paqu->f = (paqu->f + 1) % MAXNUM;
}

/* 对非空队列,求队列头部元素 */
DataType  frontQueue_seq( PSeqQueue paqu ) {
    return paqu->q[paqu->f];
}

main()
{
	PSeqQueue  A;int i;
	A=createEmptyQueue_seq();
	for(i=0;i<3;i++)
	{enQueue_seq(A, i+1);
	}
	
	
	while(!isEmptyQueue_seq(A))
	{printf("%d", frontQueue_seq(A));
		deQueue_seq(A);
	
	}
}

(3)队列的顺序循环存储

//顺序循环存储队列
#include "stdio.h"
#include "stdlib.h"

//定义一个顺序循环存储的数据类型
#define max 10
typedef struct Seqquen {
	char quen[max];
    int f,r;
}*SeqQuen; 

//创建一个队列
SeqQuen  creatquen(){
	SeqQuen q=(SeqQuen)malloc(sizeof(struct Seqquen));
    if(q==NULL)
    	printf("out of space!");
    else
    	q->f=q->r=0;
        return q;
}

//判断队列是否为空
int ifempty(SeqQuen q) {
	if(q->f==q->r){
		printf("队列为空");
		return 0; 
	}
	else {
		printf("队列不为空");
		return 1; 
	}
}


//入队列
void appendquen(SeqQuen q,char n) {
	if((q->r+ 1 ) % max == q->f){
		printf("队列已满无法入队");
	}
	else{
		q->quen[q->r]=n;
		q->r=(q->r+1)%max;
	}
}

//出队列
void deletequen(SeqQuen q){
	char n;
	if(q->f==q->r){
		printf("队列为空无法出队");
    }
	else{
		n=q->quen[q->f];
		q->f=(q->f+1)%max;
		printf("刚刚出队的元素是%c\n",n);
	}
} 

//取出队头
char getfront(SeqQuen q){
	if(q->f==q->r){
		printf("队列为空无法出队");
    }
    else{
    	return q->quen[q->f];
	}
}

//main函数测试
main(){
	SeqQuen q;
	q=creatquen();
	appendquen(q,'a');
	appendquen(q,'b');
	deletequen(q);
	printf("目前队顶的元素是%c",getfront(q));
} 




版权声明:本文为weixin_40695088原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。