知识点:
1.顺序队列是环形的
2.可以用食堂排队打饭来想队列,出队在队头,入队在队尾
3.顺序队列一定要设计成环形(为了使出队的时间复杂度为O(1))
4.判满条件 (rear+1)%queuesize == front 才是满了
5.队头和队尾相同为空,rear再向后走一步是front为满
6.注意:front和rear不能直接++
7.栈:先进后厨 队列:先进先出
8.留一个阴影部分的目的是:为了区分空和满
9.rear下标所在的地方并没有数据
结构体:
typedef struct Queue
{
int * elem;
int front;
int rear;
int queuesize;
} Queue, * PQueue;
1.初始化
void InitQueue ( PQueue pq)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return ;
pq-> elem = ( int * ) malloc ( sizeof ( int ) * INIT_SIZE) ;
assert ( pq-> elem != NULL ) ;
pq-> front = 0 ;
pq-> rear = 0 ;
pq-> queuesize = INIT_SIZE;
}
初始化 测试
Queue q;
InitQueue ( & q) ;
2.***往队列输入数据 入队(在队尾入队)
bool Push ( PQueue pq, int val)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return false ;
if ( IsFull ( pq) )
{
Inc ( pq) ;
}
pq-> elem[ pq-> rear] = val;
pq-> rear = ( pq-> rear+ 1 ) % pq-> queuesize;
return true ;
}
入队 测试
Queue q;
InitQueue ( & q) ;
for ( int i = 0 ; i< 13 ; i++ )
{
Push ( & q, i) ;
}
for ( int i = 0 ; i< 13 ; i++ )
{
int val;
Pop ( & q, & val) ;
printf ( "%d " , val) ;
}
3.***获取队头元素的值(不删除队头元素)
bool GetTop ( PQueue pq, int * rtval)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return false ;
if ( IsEmpty ( pq) )
{
return false ;
}
* rtval = pq-> elem[ pq-> front] ;
return true ;
}
出队(不删除队头元素) 测试
Queue q;
InitQueue ( & q) ;
for ( int i = 0 ; i< 13 ; i++ )
{
Push ( & q, i) ;
}
for ( int i = 0 ; i< 13 ; i++ )
{
int val;
GetTop ( & q, & val) ;
Pop ( & q, & val) ;
printf ( "%d " , val) ;
}
4.***获取队头元素的值并且删除队头元素
bool Pop ( PQueue pq, int * rtval)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return false ;
if ( IsEmpty ( pq) )
{
return false ;
}
* rtval = pq-> elem[ pq-> front] ;
pq-> front = ( pq-> front+ 1 ) % pq-> queuesize;
return true ;
}
出队(并删除队头元素) 测试
Queue q;
InitQueue ( & q) ;
for ( int i = 0 ; i< 13 ; i++ )
{
Push ( & q, i) ;
}
for ( int i = 0 ; i< 13 ; i++ )
{
int val;
Pop ( & q, & val) ;
printf ( "%d " , val) ;
}
5.判空
bool IsEmpty ( PQueue pq)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return false ;
return pq-> front == pq-> rear;
}
判空 测试
Queue q;
InitQueue ( & q) ;
for ( int i = 0 ; i< 13 ; i++ )
{
Push ( & q, i) ;
}
if ( IsEmpty ( & q) )
{
printf ( "是空队\n" ) ;
}
else
printf ( "不是空队\n" ) ;
6.判满 rear再往后走一步为front(注意为环形处理)
bool IsFull ( PQueue pq)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return false ;
return ( pq-> rear+ 1 ) % pq-> queuesize == pq-> front;
}
判满 测试
Queue q;
InitQueue ( & q) ;
for ( int i = 0 ; i< 9 ; i++ )
{
Push ( & q, i) ;
}
if ( IsFull ( & q) )
printf ( "满了\n" ) ;
else
printf ( "没有满\n" ) ;
7.获取队列中有效元素的个数
int GetLength ( PQueue pq)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return - 1 ;
return ( pq-> rear- pq-> front+ pq-> queuesize) % pq-> queuesize;
}
获取栈中有效元素 测试
Queue q;
InitQueue ( & q) ;
for ( int i = 0 ; i< 10 ; i++ )
{
Push ( & q, i) ;
}
int len = GetLength ( & q) ;
printf ( "%d\n" , len) ;
int val;
while ( ! IsEmpty ( & q) )
{
Pop ( & q, & val) ;
printf ( "%d " , val) ;
int len = GetLength ( & q) ;
printf ( "len = %d\n" , len) ;
}
8.销毁数据
void Destroy ( PQueue pq)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return ;
free ( pq-> elem) ;
pq-> elem = NULL ;
pq-> front = 0 ;
pq-> rear = 0 ;
pq-> queuesize = 0 ;
}
9.扩容
static void Inc ( PQueue pq)
{
assert ( pq != NULL ) ;
if ( pq == NULL )
return ;
pq-> queuesize*= 2 ;
pq-> elem = ( int * ) realloc ( pq-> elem, pq-> queuesize * sizeof ( int ) ) ;
assert ( pq-> elem != NULL ) ;
}