数据结构MOOC|队列


【队列】

队列:受限的线性表,一端插入(front),一端删除(rear),即FIFO。

操作集:长度MaxSize的队列Q,队列元素item是ElementType类型。

涉及操作:

1.Queue CreatQueue(int MaxSize):生成长度为MaxSize的空队列;

2.int IsFullQ(Queue Q, int MaxSize):判断队列Q是否已满;

3.void AddQ(Queue Q, ElementType item):将数据元素item插入队列Q中;

4.int IsEmptyQ(Queue Q):判断队列是否为空;

5.ElementType Delete(Queue Q):将队头数据元素从队列中删除并返回。


【队列的顺序存储实现】

//一个一维数组和两个变量rear front
#define MaxSize
struct QNode{
    ElementType Data[MaxSize]; 
    int rear;
    int front;
};


插入元素时rear+1,删除元素时front+1

front==rear时队列为空


循环队列

为了避免无法区分队列满和队列空的情况,在循环队列里能够存储元素的最大个数通常是MaxSize-1。

这种情况下,队列空front==rear;队列满front==rear+1。

通过(rear+1)%Maxsize的方式,来决定插入元素的位置。



入队操作:

void AddQ(Queue PtrQ, ElementType item){
    if((PtrQ->rear+1)% MaxSize == PtrQ->front){
        cout<<"队列满"<<endl;
        return;
    }
    PtrQ->rear = (PtrlQ->rear+1)% MaxSize;
    PtrQ->Data[PtrQ->rear] = item;
}

出队操作:

ElementType DeleteQ(Queue PtrQ){
    if(PtrQ->front == PtrQ->rear){
        cout<<"队列空"<<endl;
        return ERROR;
    }else{
        PtrQ->front = (PtrQ->front+1)% MaxSize;
        return PtrQ->Data[PtrQ->front];
    }
}

【队列的链式存储实现】

front做删除操作,rear做插入操作。

链表头既可以做插入操作也可以做删除操作,链表尾只能做插入操作(如果做删除操作,则找不到前面的指针)。

故链式存储实现队列时,front只能放在链表头部。

struct Node{
    ElementType Data; 
    struct Node *Next;
};
struct QNode{             /*链队列结构*/
    struct Node *rear;
    struct Node *front;
};
typedef struct QNode *Queue;
Queue PtrQ;

不带头结点的链式队列出队操作:

ElementType DeleteQ(Queue PtrQ){
    struct Node *FrontCell;
    ElementType FrontElem;

    if(PtrQ->front == NULL){
        cout<<"队列空"<<endl;
        return ERROR;
    }
    FrontCell = PtrQ->front;
    if(PtrQ->front == PtrQ->rear)        /*若队列只有一个元素*/
        PtrQ->front = PtrQ->rear = NULL; /*删除后队列置为空*/
    else
        PtrQ->front = PtrQ->front->Next;
    FrontElem = FrontCell->Data;
    free(FrontCell);         /*释放删除结点空间*/            
    return FrontElem;
}

【应用:多项式加法运算】

采用不带头结点的单向链表,按照指数递减的顺序排列各项。

struct PolyNode{
    int coef;     //系数
    int expon;    //指数
    struct PolyNode *link; //指向下一个节点的指针
};
typedef struct PolyNode *Polynomial;
Polynomial P1,P2;

算法思路:




PolyNode PolyAdd(PolyNomial P1, PolyNomial P1){
    Polynomial front,rear,tmp;
    int sum;
    rear = (Polymial)malloc(sizeof(struct) PolyNode);
    front = rear; //空的临时结点作为结果多项式链表头
    while(P1 && P2){
        switch(Compare(P1->expon,P2->expon)){
            case 1:
                Attach(P1->coef,P1->expon,&rear);
                P1 = P1->link;
                break;
            case -1:
                Attach(P2->coef,P2->expon,&rear);
                P2 = P2->link;
                break;
            case 0:
                sum = P1->coef + P2->coef;
                if(sum) Attach(sum,P1->expon,&rear);
                P1 = P1->link;
                P2 = P2->link;
                break;
        }
    }
    for(;P1;P1 = P1->link) Attach(P1->coef,P1->expon,&rear);
    for(;P2;P2 = P2->link) Attach(P2->coef,P2->expon,&rear);
    rear->link = NULL;
    temp = front;
    front = front->link;
    free(tmp);
    return front;
}
void Attach(int c, int e, Polynomial *pRear){
    Polynomial P;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    (*pRear)->link = P;
    *pRear = P;
}




猜你喜欢

转载自blog.csdn.net/darlingwood2013/article/details/80319483