评论

收藏

[C++] #yyds干货盘点#算法开启栈转队列武魂

编程语言 编程语言 发布于:2021-12-28 23:12 | 阅读数:307 | 评论:0

==栈接口见 算法开启小码农栈血脉==
用栈实现队列

题目
DSC0000.png

队结构体
typedef struct {
  ST PushST;//入队栈
  ST PopST;//出队栈
} MyQueue;
队初始化
MyQueue* myQueueCreate() {
  MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
  StackInit(&q->PushST);//初始化入队栈
  StackInit(&q->PopST);//初始化出队栈
  return q;
}
入“队”
DSC0001.gif
void myQueuePush(MyQueue* obj, int x) {
  StackPush(&obj->PushST,x);
}
出“队”并取出队元素
DSC0002.gif
int myQueuePop(MyQueue* obj) {
  //如果出队栈为空就从入队栈里面全导过来
  if(StackEmpty(&obj->PopST))
  {
    //导数据
    while(!StackEmpty(&obj->PushST))
    {
      //入队栈栈顶元素拿出来给出队栈
      StackPush(&obj->PopST,StackTop(&obj->PushST));
      //栈把入队栈的栈顶元素pop掉
      StackPop(&obj->PushST);
    }
  }
  //这时就说明都倒完了,所以开始pop掉出队栈元素
  int tmp = StackTop(&obj->PopST);
  StackPop(&obj->PopST);
  return tmp;
}
返回队头
int myQueuePeek(MyQueue* obj) {
  //如果出队栈为空就从入队栈里面全导过来
  if(StackEmpty(&obj->PopST))
  {
    //导数据
    while(!StackEmpty(&obj->PushST))
    {
      //入队栈栈顶元素拿出来给出队栈
      StackPush(&obj->PopST,StackTop(&obj->PushST));
      //栈把入队栈的栈顶元素pop掉
      StackPop(&obj->PushST);
    }
  }
  //就是出队函数那样只取队头而已
  return StackTop(&obj->PopST);
}
判断队空
bool myQueueEmpty(MyQueue* obj) {
  return StackEmpty(&obj->PushST) && StackEmpty(&obj->PopST);
}
队列销毁
void myQueueFree(MyQueue* obj) {
  StackDestroy(&obj->PushST);
  StackDestroy(&obj->PopST);
  free(obj);
}
DSC0003.png


队列代码(接口代码去我之前文章取) 算法开启小码农栈血脉
typedef struct {
  ST PushST;//入队栈
  ST PopST;//出队栈
} MyQueue;
MyQueue* myQueueCreate() {
  MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
  StackInit(&q->PushST);//初始化入队栈
  StackInit(&q->PopST);//初始化出队栈
  return q;
}
void myQueuePush(MyQueue* obj, int x) {
  StackPush(&obj->PushST,x);
}
int myQueuePop(MyQueue* obj) {
  //如果出队栈为空就从入队栈里面全导过来
  if(StackEmpty(&obj->PopST))
  {
    //导数据
    while(!StackEmpty(&obj->PushST))
    {
      //入队栈栈顶元素拿出来给出队栈
      StackPush(&obj->PopST,StackTop(&obj->PushST));
      //栈把入队栈的栈顶元素pop掉
      StackPop(&obj->PushST);
    }
  }
  //这时就说明都倒完了,所以开始pop掉出队栈元素
  int tmp = StackTop(&obj->PopST);
  StackPop(&obj->PopST);
  return tmp;
}
int myQueuePeek(MyQueue* obj) {
  //如果出队栈为空就从入队栈里面全导过来
  if(StackEmpty(&obj->PopST))
  {
    //导数据
    while(!StackEmpty(&obj->PushST))
    {
      //入队栈栈顶元素拿出来给出队栈
      StackPush(&obj->PopST,StackTop(&obj->PushST));
      //栈把入队栈的栈顶元素pop掉
      StackPop(&obj->PushST);
    }
  }
  //就是出队函数那样只取队头而已
  return StackTop(&obj->PopST);
}
bool myQueueEmpty(MyQueue* obj) {
  return StackEmpty(&obj->PushST) && StackEmpty(&obj->PopST);
}
void myQueueFree(MyQueue* obj) {
  StackDestroy(&obj->PushST);
  StackDestroy(&obj->PopST);
  free(obj);
}


关注下面的标签,发现更多相似文章