bo3-01~09.cpp 栈和队列算法

  1.  // bo3-9.cpp 顺序非循环队列(存储结构由c3-4.h定义)的基本操作(4个)
  2.  int QueueLength(SqQueue2 Q)
  3.  { // 返回Q的元素个数,即队列的长度
  4.    return(Q.rear-Q.front);
  5.  }
  6.  void EnQueue(SqQueue2 &Q,QElemType e)
  7.  { // 插入元素e为Q的新的队尾元素
  8.    if(Q.rear==Q.queuesize)
  9.    { // 队列满,增加存储单元
  10.      Q.base=(QElemType *)realloc(Q.base,(Q.queuesize+QUEUE_INCREMENT)*sizeof(QElemType));
  11.      if(!Q.base// 增加单元失败
  12.        exit(ERROR);
  13.    }
  14.    Q.base[Q.rear++]=e;
  15.  }
  16.  Status DeQueue(SqQueue2 &Q,QElemType &e)
  17.  { // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
  18.    if(Q.front==Q.rear) // 队列空
  19.      return ERROR;
  20.    e=Q.base[Q.front++];
  21.    return OK;
  22.  }
  23.  void QueueTraverse(SqQueue2 Q,void(*vi)(QElemType))
  24.  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  25.    int i=Q.front;
  26.    while(i!=Q.rear)
  27.      vi(Q.base[i++]);
  28.    printf("/n");
  29.  }
 
  1.  // bo3-1.cpp 顺序栈(存储结构由c3-1.h定义)的基本操作(9个)
  2.  void InitStack(SqStack &S)
  3.  { // 构造一个空栈S
  4.    if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
  5.      exit(OVERFLOW); // 存储分配失败
  6.    S.top=S.base;
  7.    S.stacksize=STACK_INIT_SIZE;
  8.  }
  9.  void DestroyStack(SqStack &S)
  10.  { // 销毁栈S,S不再存在
  11.    free(S.base);
  12.    S.base=NULL;
  13.    S.top=NULL;
  14.    S.stacksize=0;
  15.  }
  16.  void ClearStack(SqStack &S)
  17.  { // 把S置为空栈
  18.    S.top=S.base;
  19.  }
  20.  Status StackEmpty(SqStack S)
  21.  { // 若栈S为空栈,则返回TRUE,否则返回FALSE
  22.    if(S.top==S.base)
  23.      return TRUE;
  24.    else
  25.      return FALSE;
  26.  }
  27.  int StackLength(SqStack S)
  28.  { // 返回S的元素个数,即栈的长度
  29.    return S.top-S.base;
  30.  }
  31.  Status GetTop(SqStack S,SElemType &e)
  32.  { // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  33.    if(S.top>S.base)
  34.    {
  35.      e=*(S.top-1);
  36.      return OK;
  37.    }
  38.    else
  39.      return ERROR;
  40.  }
  41.  void Push(SqStack &S,SElemType e)
  42.  { // 插入元素e为新的栈顶元素
  43.    if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间
  44.    {
  45.      S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
  46.      if(!S.base)
  47.        exit(OVERFLOW); // 存储分配失败
  48.      S.top=S.base+S.stacksize;
  49.      S.stacksize+=STACK_INCREMENT;
  50.    }
  51.    *(S.top)++=e;
  52.  }
  53.  Status Pop(SqStack &S,SElemType &e)
  54.  { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  55.    if(S.top==S.base)
  56.      return ERROR;
  57.    e=*--S.top;
  58.    return OK;
  59.  }
  60.  void StackTraverse(SqStack S,void(*visit)(SElemType))
  61.  { // 从栈底到栈顶依次对栈中每个元素调用函数visit()
  62.    while(S.top>S.base)
  63.      visit(*S.base++);
  64.    printf("/n");
  65.  }
  1.  // bo3-2.cpp 链队列(存储结构由c3-2.h定义)的基本操作(9个)
  2.  void InitQueue(LinkQueue &Q)
  3.  { // 构造一个空队列Q
  4.    if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))
  5.      exit(OVERFLOW);
  6.    Q.front->next=NULL;
  7.  }
  8.  void DestroyQueue(LinkQueue &Q)
  9.  { // 销毁队列Q(无论空否均可)
  10.    while(Q.front)
  11.    {
  12.      Q.rear=Q.front->next;
  13.      free(Q.front);
  14.      Q.front=Q.rear;
  15.    }
  16.  }
  17.  void ClearQueue(LinkQueue &Q)
  18.  { // 将Q清为空队列
  19.    QueuePtr p,q;
  20.    Q.rear=Q.front;
  21.    p=Q.front->next;
  22.    Q.front->next=NULL;
  23.    while(p)
  24.    {
  25.      q=p;
  26.      p=p->next;
  27.      free(q);
  28.    }
  29.  }
  30.  Status QueueEmpty(LinkQueue Q)
  31.  { // 若Q为空队列,则返回TRUE,否则返回FALSE
  32.    if(Q.front->next==NULL)
  33.      return TRUE;
  34.    else
  35.      return FALSE;
  36.  }
  37.  int QueueLength(LinkQueue Q)
  38.  { // 求队列的长度
  39.    int i=0;
  40.    QueuePtr p;
  41.    p=Q.front;
  42.    while(Q.rear!=p)
  43.    {
  44.      i++;
  45.      p=p->next;
  46.    }
  47.    return i;
  48.  }
  49.  Status GetHead(LinkQueue Q,QElemType &e)
  50.  { // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
  51.    QueuePtr p;
  52.    if(Q.front==Q.rear)
  53.      return ERROR;
  54.    p=Q.front->next;
  55.    e=p->data;
  56.    return OK;
  57.  }
  58.  void EnQueue(LinkQueue &Q,QElemType e)
  59.  { // 插入元素e为Q的新的队尾元素
  60.    QueuePtr p;
  61.    if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败
  62.      exit(OVERFLOW);
  63.    p->data=e;
  64.    p->next=NULL;
  65.    Q.rear->next=p;
  66.    Q.rear=p;
  67.  }
  68.  Status DeQueue(LinkQueue &Q,QElemType &e)
  69.  { // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
  70.    QueuePtr p;
  71.    if(Q.front==Q.rear)
  72.      return ERROR;
  73.    p=Q.front->next;
  74.    e=p->data;
  75.    Q.front->next=p->next;
  76.    if(Q.rear==p)
  77.      Q.rear=Q.front;
  78.    free(p);
  79.    return OK;
  80.  }
  81.  void QueueTraverse(LinkQueue Q,void(*vi)(QElemType))
  82.  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  83.    QueuePtr p;
  84.    p=Q.front->next;
  85.    while(p)
  86.    {
  87.      vi(p->data);
  88.      p=p->next;
  89.    }
  90.    printf("/n");
  91.  }
  1.  // bo3-3.cpp 循环队列(存储结构由c3-3.h定义)的基本操作(9个)
  2.  void InitQueue(SqQueue &Q)
  3.  { // 构造一个空队列Q
  4.    Q.base=(QElemType *)malloc(MAX_QSIZE*sizeof(QElemType));
  5.    if(!Q.base// 存储分配失败
  6.      exit(OVERFLOW);
  7.    Q.front=Q.rear=0;
  8.  }
  9.  void DestroyQueue(SqQueue &Q)
  10.  { // 销毁队列Q,Q不再存在
  11.    if(Q.base)
  12.      free(Q.base);
  13.    Q.base=NULL;
  14.    Q.front=Q.rear=0;
  15.  }
  16.  void ClearQueue(SqQueue &Q)
  17.  { // 将Q清为空队列
  18.    Q.front=Q.rear=0;
  19.  }
  20.  Status QueueEmpty(SqQueue Q)
  21.  { // 若队列Q为空队列,则返回TRUE;否则返回FALSE
  22.    if(Q.front==Q.rear) // 队列空的标志
  23.      return TRUE;
  24.    else
  25.      return FALSE;
  26.  }
  27.  int QueueLength(SqQueue Q)
  28.  { // 返回Q的元素个数,即队列的长度
  29.    return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
  30.  }
  31.  Status GetHead(SqQueue Q,QElemType &e)
  32.  { // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
  33.    if(Q.front==Q.rear) // 队列空
  34.      return ERROR;
  35.    e=Q.base[Q.front];
  36.    return OK;
  37.  }
  38.  Status EnQueue(SqQueue &Q,QElemType e)
  39.  { // 插入元素e为Q的新的队尾元素
  40.    if((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满
  41.      return ERROR;
  42.    Q.base[Q.rear]=e;
  43.    Q.rear=(Q.rear+1)%MAX_QSIZE;
  44.    return OK;
  45.  }
  46.  Status DeQueue(SqQueue &Q,QElemType &e)
  47.  { // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
  48.    if(Q.front==Q.rear) // 队列空
  49.      return ERROR;
  50.    e=Q.base[Q.front];
  51.    Q.front=(Q.front+1)%MAX_QSIZE;
  52.    return OK;
  53.  }
  54.  void QueueTraverse(SqQueue Q,void(*vi)(QElemType))
  55.  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  56.    int i;
  57.    i=Q.front;
  58.    while(i!=Q.rear)
  59.    {
  60.      vi(Q.base[i]);
  61.      i=(i+1)%MAX_QSIZE;
  62.    }
  63.    printf("/n");
  64.  }
  1.  // bo3-5.cpp 链栈(存储结构由c2-2.h定义)的基本操作(4个)
  2.  // 部分基本操作是由bo2-8.cpp中的函数改名得来
  3.  // 另一部分基本操作是由调用bo2-8.cpp中的函数(取特例)得来
  4.  typedef SElemType ElemType; // 栈结点类型和链表结点类型一致
  5.  #include"c2-2.h" // 单链表存储结构
  6.  typedef LinkList LinkStack; // LinkStack是指向栈结点的指针类型
  7.  #define InitStack InitList // InitStack()与InitList()作用相同,下同
  8.  #define DestroyStack DestroyList
  9.  #define ClearStack ClearList
  10.  #define StackEmpty ListEmpty
  11.  #define StackLength ListLength
  12.  #include"bo2-8.cpp" // 无头结点单链表的基本操作
  13.  Status GetTop(LinkStack S,SElemType &e)
  14.  { // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  15.    return GetElem(S,1,e);
  16.  }
  17.  Status Push(LinkStack &S,SElemType e)
  18.  { // 插入元素e为新的栈顶元素
  19.    return ListInsert(S,1,e);
  20.  }
  21.  Status Pop(LinkStack &S,SElemType &e)
  22.  { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  23.    return ListDelete(S,1,e);
  24.  }
  25.  void StackTraverse(LinkStack S,void(*visit)(SElemType))
  26.  { // 从栈底到栈顶依次对栈中每个元素调用函数visit()
  27.    LinkStack temp,p=S; // p指向栈顶元素
  28.    InitStack(temp); // 初始化临时栈temp
  29.    while(p)
  30.    {
  31.      Push(temp,p->data); // 由S栈顶到栈底,依次将栈元素入栈到temp栈
  32.      p=p->next;
  33.    }
  34.    ListTraverse(temp,visit); // 遍历temp线性表
  35.  }

 

  1.  // bo3-5.cpp 链栈(存储结构由c2-2.h定义)的基本操作(4个)
  2.  // 部分基本操作是由bo2-8.cpp中的函数改名得来
  3.  // 另一部分基本操作是由调用bo2-8.cpp中的函数(取特例)得来
  4.  typedef SElemType ElemType; // 栈结点类型和链表结点类型一致
  5.  #include"c2-2.h" // 单链表存储结构
  6.  typedef LinkList LinkStack; // LinkStack是指向栈结点的指针类型
  7.  #define InitStack InitList // InitStack()与InitList()作用相同,下同
  8.  #define DestroyStack DestroyList
  9.  #define ClearStack ClearList
  10.  #define StackEmpty ListEmpty
  11.  #define StackLength ListLength
  12.  #include"bo2-8.cpp" // 无头结点单链表的基本操作
  13.  Status GetTop(LinkStack S,SElemType &e)
  14.  { // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  15.    return GetElem(S,1,e);
  16.  }
  17.  Status Push(LinkStack &S,SElemType e)
  18.  { // 插入元素e为新的栈顶元素
  19.    return ListInsert(S,1,e);
  20.  }
  21.  Status Pop(LinkStack &S,SElemType &e)
  22.  { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  23.    return ListDelete(S,1,e);
  24.  }
  25.  void StackTraverse(LinkStack S,void(*visit)(SElemType))
  26.  { // 从栈底到栈顶依次对栈中每个元素调用函数visit()
  27.    LinkStack temp,p=S; // p指向栈顶元素
  28.    InitStack(temp); // 初始化临时栈temp
  29.    while(p)
  30.    {
  31.      Push(temp,p->data); // 由S栈顶到栈底,依次将栈元素入栈到temp栈
  32.      p=p->next;
  33.    }
  34.    ListTraverse(temp,visit); // 遍历temp线性表
  35.  }

 

  1.  // bo3-6.cpp 用单链表的基本操作实现链队列(存储结构由c3-2.h定义)的基本操作(9个)
  2.  typedef QElemType ElemType;
  3.  #define LinkList QueuePtr // 定义单链表的类型与相应的链队列的类型相同
  4.  #define LNode QNode
  5.  #include"bo2-2.cpp" // 单链表的基本操作
  6.  void InitQueue(LinkQueue &Q)
  7.  { // 构造一个空队列Q
  8.    InitList(Q.front); // 调用单链表的基本操作
  9.    Q.rear=Q.front;
  10.  }
  11.  void DestroyQueue(LinkQueue &Q)
  12.  { // 销毁队列Q(无论空否均可)
  13.    DestroyList(Q.front);
  14.    Q.rear=Q.front;
  15.  }
  16.  void ClearQueue(LinkQueue &Q)
  17.  { // 将Q清为空队列
  18.    ClearList(Q.front);
  19.    Q.rear=Q.front;
  20.  }
  21.  Status QueueEmpty(LinkQueue Q)
  22.  { // 若Q为空队列,则返回TRUE,否则返回FALSE
  23.    return ListEmpty(Q.front);
  24.  }
  25.  int QueueLength(LinkQueue Q)
  26.  { // 求队列的长度
  27.    return ListLength(Q.front);
  28.  }
  29.  Status GetHead(LinkQueue Q,QElemType &e)
  30.  { // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
  31.    return GetElem(Q.front,1,e);
  32.  }
  33.  void EnQueue(LinkQueue &Q,QElemType e)
  34.  { // 插入元素e为Q的新的队尾元素
  35.    QueuePtr p;
  36.    if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败
  37.      exit(OVERFLOW);
  38.    p->data=e;
  39.    p->next=NULL;
  40.    Q.rear->next=p;
  41.    Q.rear=p;
  42.  }
  43.  Status DeQueue(LinkQueue &Q,QElemType &e)
  44.  { // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
  45.    if(Q.front->next==Q.rear) // 队列仅有1个元素(删除的也是队尾元素)
  46.      Q.rear=Q.front; // 令队尾指针指向头结点
  47.    return ListDelete(Q.front,1,e);
  48.  }
  49.  void QueueTraverse(LinkQueue Q,void(*vi)(QElemType))
  50.  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  51.    ListTraverse(Q.front,vi);
  52.  }

 

  1.  // bo3-7.cpp 顺序非循环队列(存储结构由c3-5.h定义)的基本操作(9个)
  2.  void InitQueue(SqQueue1 &Q)
  3.  { // 构造一个空队列Q
  4.    if(!(Q.base=(QElemType*)malloc(QUEUE_INIT_SIZE*sizeof(QElemType))))
  5.      exit(ERROR); // 存储分配失败
  6.    Q.rear=0; // 空队列,尾指针为0
  7.    Q.queuesize=QUEUE_INIT_SIZE; // 初始存储容量
  8.  }
  9.  void DestroyQueue(SqQueue1 &Q)
  10.  { // 销毁队列Q,Q不再存在
  11.    free(Q.base); // 释放存储空间
  12.    Q.base=NULL;
  13.    Q.rear=Q.queuesize=0;
  14.  }
  15.  void ClearQueue(SqQueue1 &Q)
  16.  { // 将Q清为空队列
  17.    Q.rear=0;
  18.  }
  19.  Status QueueEmpty(SqQueue1 Q)
  20.  { // 若队列Q为空队列,则返回TRUE;否则返回FALSE
  21.    if(Q.rear==0)
  22.      return TRUE;
  23.    else
  24.      return FALSE;
  25.  }
  26.  int QueueLength(SqQueue1 Q)
  27.  { // 返回Q的元素个数,即队列的长度
  28.    return Q.rear;
  29.  }
  30.  Status GetHead(SqQueue1 Q,QElemType &e)
  31.  { // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
  32.    if(Q.rear)
  33.    {
  34.      e=*Q.base;
  35.      return OK;
  36.    }
  37.    else
  38.      return ERROR;
  39.  }
  40.  void EnQueue(SqQueue1 &Q,QElemType e)
  41.  { // 插入元素e为Q的新的队尾元素
  42.    if(Q.rear==Q.queuesize) // 当前存储空间已满
  43.    { // 增加分配
  44.      Q.base=(QElemType*)realloc(Q.base,(Q.queuesize+QUEUE_INCREMENT)*sizeof(QElemType));
  45.      if(!Q.base// 分配失败
  46.        exit(ERROR);
  47.      Q.queuesize+=QUEUE_INCREMENT; // 增加存储容量
  48.    }
  49.    Q.base[Q.rear++]=e; // 入队新元素,队尾指针+1
  50.  }
  51.  Status DeQueue(SqQueue1 &Q,QElemType &e)
  52.  { // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
  53.    int i;
  54.    if(Q.rear) // 队列不空
  55.    {
  56.      e=*Q.base;
  57.      for(i=1;i<Q.rear;i++)
  58.        Q.base[i-1]=Q.base[i]; // 依次前移队列元素
  59.      Q.rear--; // 尾指针前移
  60.      return OK;
  61.    }
  62.    else
  63.      return ERROR;
  64.  }
  65.  void QueueTraverse(SqQueue1 Q,void(*vi)(QElemType))
  66.  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  67.    int i;
  68.    for(i=0;i<Q.rear;i++)
  69.      vi(Q.base[i]);
  70.    printf("/n");
  71.  }

 

  1.  // bo3-8.cpp 循环队列(存储结构由c3-4.h定义)的基本操作(4个)
  2.  int QueueLength(SqQueue2 Q)
  3.  { // 返回Q的元素个数,即队列的长度
  4.    return(Q.rear-Q.front+Q.queuesize)%Q.queuesize;
  5.  }
  6.  void EnQueue(SqQueue2 &Q,QElemType e)
  7.  { // 插入元素e为Q的新的队尾元素
  8.    int i;
  9.    if((Q.rear+1)%Q.queuesize==Q.front)
  10.    { // 队列满,增加存储单元
  11.      Q.base=(QElemType *)realloc(Q.base,(Q.queuesize+QUEUE_INCREMENT)*sizeof(QElemType));
  12.      if(!Q.base// 增加单元失败
  13.        exit(ERROR);
  14.      if(Q.front>Q.rear) // 形成循环
  15.      {
  16.        for(i=Q.queuesize-1;i>=Q.front;i--)
  17.          Q.base[i+QUEUE_INCREMENT]=Q.base[i]; // 移动高端元素到新的高端
  18.        Q.front+=QUEUE_INCREMENT; // 移动队头指针
  19.      }
  20.      Q.queuesize+=QUEUE_INCREMENT; // 增加队列长度
  21.    }
  22.    Q.base[Q.rear]=e; // 将e插入队尾
  23.    Q.rear=++Q.rear%Q.queuesize; // 移动队尾指针
  24.  }
  25.  Status DeQueue(SqQueue2 &Q,QElemType &e)
  26.  { // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
  27.    if(Q.front==Q.rear) // 队列空
  28.      return ERROR;
  29.    e=Q.base[Q.front]; // 用e返回队头元素
  30.    Q.front=++Q.front%Q.queuesize; // 移动队头指针
  31.    return OK;
  32.  }
  33.  void QueueTraverse(SqQueue2 Q,void(*vi)(QElemType))
  34.  { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  35.    int i=Q.front; // i指向队头
  36.    while(i!=Q.rear) // 没到队尾
  37.    {
  38.      vi(Q.base[i]); // 调用函数vi()
  39.      i=++i%Q.queuesize; // 向后移动i指针
  40.    }
  41.    printf("/n");
  42.  }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值