博客园  :: 首页  :: 新随笔  :: 管理

4.栈与队列

Posted on 2020-06-26 14:17  wsg_blog  阅读(277)  评论(0编辑  收藏  举报

index 数据结构与算法

栈(stack)

栈是一种先进后出的数据结构,浏览器的“后退,前进”键就是通过栈的结构来实现的,深度优先遍历(dfs、递归)的也会用到栈,栈(Stack)是限定仅在表尾进行插入和删除的线性表

顺序存储结构

typedef int SElemType;
typedef struct{
  SElemType data[MAXSIZE];
  int top;
}SqStack;

Status Push(SqStack *S, SElemType e){
  if(S->top == MAXSIZE-1){
  return ERROR;
  }
  S->top++;
  S->data[S->top]=e;
  return OK;
}

Status Pop(SqStack *S, SElemType *e){
  if(S->top == -1)
    return ERROR;
  *e=S->data[top];
  S->top--;
  return OK;
}

链式存储结构

typedef struct StackNode{
  SElemType data;
  struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
  LinkStackPtr top;  //栈顶指针
  int count;
} LinkStack;

Status Push(LinkStack *S, SElemType e){
  LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
  s->data=e;
  s->next=S->top;
  S->top=s;
  S->count++;
  return OK;
}

Status Pop(LinkStack *S, SElemType *e){
  if(S->count <= 0)
    return ERROR;
  *e=S->top->data;
  LinkStackPtr p=S->top;
  S->top=p->next;
  free(p);
  S->top--;
  return OK;
}

栈的作用

栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。反之,像数组等,因为要分散精力去考虑数组下标增减等细节问题,反而掩盖了问题的本质。

队列(queue)

队列是一种先进先出的数据结构,队列在程序设计中用的非常频繁

链式存储结构

typedef int QElemType;
typedef struct QNode{  //结点结构
  QElemType data;
  struct QNode *next;
}QNode, *QueuePtr;
typedef struct{  //链表结构
  QueuePtr front, rear;
}LinkQueue;

//入队,队列结构:front->...mid->...rear
Status EnQueue(LinkQueue *Q, QElemType e){
  QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
  if(!s)
    exit(OVERFLOW);
  s->data=e;
  s->next=NULL;
  Q->rear->next=s;
  Q->next=s;
  return OK;
}

//出队
Status DeQueue(LinkQueue *Q, QElemType *e){
  QueuePtr p;
  if(Q->rear == Q->front) return ERROR;
  p=Q->front->next;
  *e=p->data;
  Q->front->next=p->next;
  if(Q->rear == p)
    Q->rear=Q->front;
  free(q);
  return OK;
}