73.有關棧佇列的演算法實現

不爱美女爱辣条發表於2024-11-29

承接上次狀態不佳整理的有關棧佇列的總結https://www.cnblogs.com/gaodiyuanjin/p/18424324
作補充 關於演算法的實現 主要就是棧和佇列的順序儲存和鏈式儲存

順序棧

初始化棧頂指標:
S.top=-1; //S.top=0
//入棧
bool Push(SqStack &S,ElemType x){
    if(S.top==MaxSize-1)       //棧滿
        return false;
    S.data[++S.top]=x; //S.data[S.top++]=x;
    return true;
}
//出棧
bool Pop(SqStack &S,ElemType x){
    if(S.top==-1)       //棧空
        return false;
    x=S.data[S.top--];  //x=S.data[--S.top];  
    return true;
}

鏈棧

不帶頭結點的鏈棧
// 入棧操作
bool Push(Stack *S, ElemType x) {
    Node *p = (Node *)malloc(sizeof(Node));
    p->data = x;
    p->next = S->top;
    S->top = p;
    return true;
}
// 出棧操作
bool Pop(Stack *S, ElemType x) {
    if (S->top == NULL) {  //棧空
        return false;
    }
    Node *p = S->top;
    x = p->data;
    S->top = p->next;
    free(p);
    return true;
}

帶頭結點的鏈棧
// 入棧操作
bool Push(Stack *S, ElemType x) {
    Node *p = (Node *)malloc(sizeof(Node));
    p->data = x;
    p->next = S->header->next;
    S->header->next = p;
    return true;
}
// 出棧操作
bool Pop(Stack *S, ElemType x) {
    if (S->header->next == NULL) {  //棧空
        return false;
    }
    Node *p = S->header->next;
    x = p->data;
    S->header->next = p->next;
    free(p);
    return true;
}

佇列的順序儲存

// 入隊操作
bool Enqueue(SeqQueue *Q, ElemType x) {
    if ((Q->rear + 1) % MaxSize == Q->front) {  //隊滿
        return false;
    }
    Q->data[Q->rear] = x;
    Q->rear = (Q->rear + 1) % MaxSize;
    return true;
}

// 出隊操作
bool Dequeue(SeqQueue *Q, ElemType x) {
    if (Q->front == Q->rear) {  //隊空
        return false;
    }
    x = Q->data[Q->front];
    Q->front = (Q->front + 1) % MaxSize
    return true;
}

迴圈佇列的順序儲存

初始化:
Q.rear=Q.front=0;
//入隊
bool EnQueue(SqQueue &Q,ElemType x){
    if((Q.rear+1)%MaxSize==Q.front)    //隊滿
        return false;
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
}
//出隊
bool DeQueue(SqQueue &Q,ElemType &x){
    if(Q.rear==Q.front)     //隊空
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%MaxSize;
    return true;
}

佇列的鏈式儲存

帶頭結點
初始化:
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
//入隊
void EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}
//出隊
bool DeQueue(LinkQueue &Q,ElemType x){
    if(Q.front==Q.rear)     //空隊
        return false;
    LinkNode *p=Q.front->next;
    x=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)  //佇列只有一個結點 刪除後變為空
        Q.rear=Q.front;
    free(p);
    return true;
}

不帶頭結點
初始化:
Q.front = NULL;
Q.rear = NULL;
//入隊
void EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    if(Q.rear == NULL){  //隊空
        Q.front = s;
        Q.rear = s;
    }else{
        Q.rear->next=s;
        Q.rear=s;
    }
}
//出隊
bool DeQueue(LinkQueue &Q,ElemType x){
    if(Q.front==NULL)     //空隊
        return false;
    LinkNode *p=Q.front;
    x=p->data;
    Q.front=p->next;
    if(Q.front==NULL)  //佇列變為空
        Q.rear=NULL;
    free(p);
    return true;
}

相關文章