链队列实现如下:
//队列实现——链队列
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
typedef struct queue{
ElementType data;
struct queue* next;
}Queue;
typedef struct LinkQ{
Queue *rear, *front;
}Q;
void make_empty( Q &p ); //初始化栈
int IsEmpty( Q ptrq ); //判断队列是否为空,若为空,返回1,否则返回0
void EnQueue ( ElementType x, Q &ptrq ); //入队
ElementType DeQueue( Q &ptrq ); //出队
ElementType GetTop( Q ptrq ); //读取队头元素
int length( Q ptrq ); //求队长
int main ( void )
{
Q ptrq;
make_empty( ptrq );
int i, len;
for( i = 5; i < 12; i++ ){
EnQueue ( i, ptrq );
}
len = length( ptrq );
printf( "len = %d\n", len );
for( i = 0; i < 3; i++ )
DeQueue( ptrq );
if( IsEmpty( ptrq ) )
printf( "表空\n" );
else
printf( "表不空,有元素Len = %d个\n", len );
ElementType x = GetTop( ptrq );
printf( "队头元素是:%d\n, 队尾元素是%d\n", x, ptrq.rear -> data );
return 0;
}
void make_empty( Q &p )
{
p.front = p.rear = ( Queue* )malloc( sizeof( Queue ) );
p.front -> next = NULL;
}
int IsEmpty( Q ptrq )
{
return ptrq.rear == ptrq.front;
}
void EnQueue ( ElementType x, Q &ptrq )
{
Queue *s = ( Queue* )malloc( sizeof( Queue ) );
if( s == NULL ){
printf( "申请空间出错\n" );
exit(0);
}
s -> data = x;
s -> next = NULL;
ptrq.rear -> next = s;
ptrq.rear = s;
}
ElementType DeQueue( Q &ptrq )
{
if( ptrq.rear == ptrq.front ){
printf( "队空\n" );
exit(0);
}
Queue *p = ptrq.front -> next;
ElementType x = p -> data;
ptrq.front -> next = p -> next;
if( ptrq.rear == p )
ptrq.rear = ptrq.front;
free( p );
return x;
}
ElementType GetTop( Q ptrq )
{
if( IsEmpty( ptrq ) ){
printf( "队空\n" );
exit(0);
}
return ptrq.front -> next -> data;
}
int length( Q ptrq )
{
int len = 0;
Queue *p = ptrq.front;
while( p -> next != NULL ){
len++;
p = p -> next;
}
return len;
}
用C写的时候指针指来指去写乱掉了,就用了引用来传递,主函数里的例子有点像陈越老师、何钦铭老师MOOC里面队列小测验的那道题目,写一遍之后思路清晰了不少。
双端队列相关知识点(王道):
双端队列指允许在两端都可以进行入队和出队操作的队列。分为:
(1)两端都可以入队和出队的双端队列;
(2)输入受限的双端队列,有一端允许插入和删除,而另一端只允许删除;
(3)输出受限的双端队列,有一端允许插入和删除,而另一端只允许插入。