数据结构——栈和队列知识点回顾

 

注意事项:

  • S.top=-1,栈顶指针指向的就是栈顶元素,进栈时的操作是指针先加1,再入栈,S.data[++S.top]=x;出栈时的操作,先出栈,指针减1,x=S.data[S.top--];如果栈顶指针初始化S.top=0,即栈顶指针指向栈顶元素的下一个位置,则入栈操作变为S.data[S.top++]=x;出栈时的操作x=S.data[--S.top];
  • 对于n个不同的元素进栈,出栈序列的个

队列

  • 循环队列,区分队空还是队满的情况,有三种处理方式
  1. 牺牲一个单元来区分队空和堆满,入队时少用一个队列单元,队头指针在 队尾指针的下一位置作为队满的标志。

          队满条件:(Q.rear+1)%MaxSize==Q.front

          队空条件:Q.front==Q.rear

          队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize

     2、类型中增设表示元素个数的数据成员

          队满条件:Q.size==MaxSzie

          队空条件:Q.size==0

         这两种情况都有Q.front==Q.rear

     3、类型中增设tag数据成员,以区分是队满还是队空。

          tag==0时,若因删除导致Q.front==Q.rear则为队空;tag==1 时,若因插入导致Q.front==Q.rear则未队满

  • 循环队列操作
//(1)初始化,不是为了判断队空
void InitQueue(&Q){
    Q.rear=Q.front=0;
}

//(2)判队空
bool isEmpty(Q){
    if(Q.rear==Q.front)
        return true;
    else
        return false;
}

//(3) 入队
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;
}

//(4)出队
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;
}


//入队
void EnQueue(LinkQueue &Q,ElemType x){
    s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=x;s->next=NULL; // 创建新结点,插入到链尾
    Q.rear->next=x;
    Q.rear=s;
}
//出队
void DnQueue(LinkQueue &Q,ElemType &x){
    if(Q.front==Q.rear)    return false; //空队
    p=Q.front->next;
    x=p->data;
    Q.front->next=p->next;

   if(Q.rear==p)

        Q.rear=Q.front;  //若原队列中只有一个结点,删除后变空
    free(p);
}

以下为栈和队列的思维导图

猜你喜欢

转载自blog.csdn.net/lhy2239705435/article/details/85008487