数据结构与算法-栈和队列

28 阅读1分钟

导图

课程www.bilibili.com/video/BV1m6…

*(解引用运算符)和&(取地址运算符)

image.png

image.png

一、栈

1、栈的基本操作

1.1 核心

后进先出

image.png

1.2 栈的存储

1.2.1 顺序栈
  • 表示
#define MAXSIZE 100
typedef struct{
    SElementType *base;//栈底指针
    SElmentType *top;//栈顶指针
    int stacksize;//栈的大小
}SqStack;

image.png

  • 进栈
Status Push(SqElementType &S,SElementType e){
    if(S.top-S.base==S.size){//先判断栈是否满了
        return false;
    }
    //等价于*S.top++==e;
    *S.top==e;
    S.top++;
}
  • 出栈(获取并移除栈顶的元素
Status Pop(SqElementType &S,SelmentType &e){
    if(S.top==S.base){//先判断栈是否为空
        return false;
    }
    e=*--S.top;//栈顶的元素是top的下一个下标所在的元素
    return true;
}
1.2.2 链栈
  • 表示
typedef struct StackNode{
    SElemtType data;
    struct LinkStack *next;
}StackNode,*LinkStack;
LinkStack S;//定义一个指向链栈节点的指针变量S

image.png

  • 进栈

image.png

Status Push(LinkStack &S,SelmentType e){
      p=new StackNode;//生成新节点p
      if(!p){ return OVERFLOW}//return 返回函数调用结果,exit向操作系统报告退出状态,终止程序
      p->data=e;
      p->next=S;
      p=S;
      return true;
}
  • 出栈
Satus pop(LinkStack &S,ELement &e){
    if(S==NULL){ return false;}
    e=S->data;
    p=S;
    S=S->next;
    delete p;
    return true;
}

二、队列

1、链队列(带头节点的单链表)

  • 表示
typedef struct Qnode{//队列单个元素
    QElemType data;
    struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct{//队列链式表示
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
}LinkQueue;

约定带头节点 image.png

  • 基本操作

入队

Status EnQueue(LinkQueue &Q,QElemType e){
    p=new QNode;
    if(!p) return OVERFLOW;
    p->data=e;
    p-next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return true;
}

image.png

出队

image.png

2、队列顺序表示(循环队列)

image.png

define M 100
typedef struct{
    QElementType *base;//用base指针给队列开辟一块连续内存空间
    int front;//队头下标
    int rear;//队尾下标
}SqQueue;
SqQueue Q;

image.png

  • 入队
Status EnQueue(SqQueue *Q,QElementType e){
    if((Q.rear+1)%M==Q.front) return false;//先判断是否伪满
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%M;
    return true;
}
  • 出队
Status DeQueue(SqQueue *Q,QElementType &e){
    if(Q.front==Q.rear)  return false;
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%M;
    return true;
}