队列

1、循环队列的顺序存储结构代码如下:

/* QElemType类型根据实际情况而定,这里假设为int */
typedef int QElemType;    
/* 循环队列的顺序存储结构 */
typedef struct
{
    QElemType data[MAXSIZE];
    /* 头指针 */
    int front;            
    /* 尾指针,若队列不空,
       指向队列尾元素的下一个位置 */
    int rear;             
} SqQueue;


2、循环队列的初始化代码如下:
/* 初始化一个空队列Q */
Status InitQueue(SqQueue *Q)
{
    Q->front = 0;
    Q->rear = 0;
    return OK;
}


3、循环队列求队列长度代码如下:
/* 返回Q的元素个数,也就是队列的当前长度 */
int QueueLength(SqQueue Q)
{
    return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}


4、循环队列的入队列操作代码如下:
/* 若队列未满,则插入元素e为Q新的队尾元素 */
Status EnQueue(SqQueue *Q, QElemType e)
{
    /* 队列满的判断 */
    if ((Q->rear + 1) % MAXSIZE == Q->front)    
        return ERROR;
    /* 将元素e赋值给队尾 */
    Q->data[Q->rear] = e;                       
    /* rear指针向后移一位置, */
    Q->rear = (Q->rear + 1) % MAXSIZE;          
    /* 若到最后则转到数组头部 */
    return OK;
}


5、循环队列的出队列操作代码如下:

/* 若队列不空,则删除Q中队头元素,用e返回其值 */
Status DeQueue(SqQueue *Q, QElemType *e)
{
    /* 队列空的判断 */
    if (Q->front == Q->rear)                
        return ERROR;
    /* 将队头元素赋值给e */
    *e = Q->data[Q->front];                 
    /* front指针向后移一位置, */
    Q->front = (Q->front + 1) % MAXSIZE;    
    /* 若到最后则转到数组头部 */
    return  OK;
}


6、链队列的结构为:
/* QElemType类型根据实际情况而定,这里假设为int */
typedef int QElemType;       
/* 结点结构 */
typedef struct QNode         
{
    QElemType data;
    struct QNode *next;
} QNode, *QueuePtr;
/* 队列的链表结构 */
typedef struct               
{
    /* 队头、队尾指针 */
    QueuePtr front, rear;    
} LinkQueue;


7、入队操作时,其实就是在链表尾部插入结点,其代码如下:

/* 插入元素e为Q的新的队尾元素 */
Status EnQueue(LinkQueue *Q, QElemType e)
{
    QueuePtr s = 
(QueuePtr)malloc(sizeof(QNode));
    /* 存储分配失败 */
    if (!s)               
        exit(OVERFLOW);
    s->data = e;
    s->next = NULL;
    /* 把拥有元素e新结点s赋值给原队尾结点的后继, */
    Q->rear->next = s;    
    /* 见上图中① */
    /* 把当前的s设置为队尾结点,rear指向s,见上图中② */
    Q->rear = s;          
    return OK;
}


8、出队操作时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需将rear指向头结点,代码如下:

/* 若队列不空,删除Q的队头元素,用e返回其值,
并返回OK,否则返回ERROR */
Status DeQueue(LinkQueue *Q, QElemType *e)
{
    QueuePtr p;
    if (Q->front == Q->rear)
        return ERROR;
    /* 将欲删除的队头结点暂存给p,见上图中① */
    p = Q->front->next;          
    /* 将欲删除的队头结点的值赋值给e */
    *e = p->data;                
    /* 将原队头结点后继p->next赋值给头结点后继, */
    Q->front->next = p->next;    
    /* 见上图中② */
    /* 若队头是队尾,则删除后将rear指向头结点,见上图中③ */
    if (Q->rear == p)            
        Q->rear = Q->front;
    free(p);
    return OK;
}


9、栈和队列的异同。

(一)栈与队列的相同点:

 (1)都是线性结构。

 (2)插入操作都是限定在表尾进行。

 (3)都可以通过顺序结构和链式结构实现。、

 (4)插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

 (5)多链栈和多链队列的管理模式可以相同。

(二)栈与队列的不同点:

 (1)删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

 (2)应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

 (3)顺序栈能够实现多栈空间共享,而顺序队列不能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值