数据结构之栈与队列的面试题:用两个栈实现一个队列

栈的原则是先进的后出,而队列是先进先出,那么如何利用两个栈来实现一个队列呢?
我们的思路是利用两个栈,一个栈作为桥梁,而另外一个作为我们的“队列”。实际上,我们首先对桥梁栈进行入栈,入栈完毕后,再依次去桥梁栈内元素,入栈到我们的“队列”当中去,此时我们的桥梁栈的栈顶就变成了我们“队列”里的队尾,而桥梁栈的栈底,则变成了“队列”里的队首。
这里写图片描述

//实现

#include <stdio.h>
#include "seqstack.h"

typedef struct queue_by2stackInit {
  SeqStack input;//这个栈为桥梁栈
  SeqStack output;//这个为实际的队列栈
}queue_by2stack;

void queue_by2stackInit(queue_by2stack* q)//初始化新的队列
{
  if(q == NULL)
  {
    return;
  }
  SeqStackInit(&q->input);
  SeqStackInit(&q->output);
  return;
}

void queue_by2stackPush(queue_by2stack* q, SeqStackType value)//入队
{
  if(q == NULL) {
    return;
  }

  SeqStackType top;
  int ret;
  while(1) {
    ret = SeqStackGetFront(&q->output, &top);
    if(ret == -1) {
      break;
    }

    SeqStackPush(&q->input, top);
    SeqStackPop(&q->output);
  }

  SeqStackPush(&q->input, value);
  while(1) {
    ret = SeqStackGetFront(&q->input, &top);
    if(ret == -1) {
      break;
    }

    SeqStackPush(&q->output, top);
    SeqStackPop(&q->input);
  }
  return;
}

void queue_by2stackPop(queue_by2stack* q)//出队
{
  if(q == NULL) {
    return;
  }

  SeqStackPop(&q->output);
  return;
}

int queue_by2stackTop(queue_by2stack* q, SeqStackType* value)//取队首元素
{
  if(q == NULL || value == NULL)
  {
    return -1;
  }
  if(q->output.size == 0) {
    return -1;
  }

  SeqStackGetFront(&q->output, value);
  return 1;
}

void queue_by2stackPrint(queue_by2stack* q)
{
  if(q == NULL) {
    return;
  }

  size_t i = 0;
  for(; i < q->output.size; ++i) {
    printf("%c ", q->output.data[i]);
  }
  printf("\n");
}

同样这里,也用到了我们的顺序栈的基本操作函数来帮助我们实现这个队里。

//测试代码
int main()
{
  queue_by2stack q;
  queue_by2stackInit(&q);
  queue_by2stackPush(&q, 'a');
  queue_by2stackPush(&q, 'b');
  queue_by2stackPush(&q, 'c');
  queue_by2stackPush(&q, 'd');

  queue_by2stackPrint(&q);
  SeqStackType value;
  int ret; 
  ret = queue_by2stackTop(&q,&value);
  printf("expected ret 1, actual ret %d\n",ret);
  printf("expected value a, actual value %c\n",value);

  queue_by2stackPop(&q);
  queue_by2stackPrint(&q);
  ret = queue_by2stackTop(&q,&value);
  printf("expected value b, actual value %c\n",value);
  printf("expected ret 1, actual %d\n",ret);

  queue_by2stackPop(&q);
  queue_by2stackPrint(&q);
  ret = queue_by2stackTop(&q,&value);
  printf("expected ret 1, actual %d\n",ret);
  printf("expected value c, actual value %c\n",value);

  queue_by2stackPop(&q);
  queue_by2stackPrint(&q);
  ret = queue_by2stackTop(&q,&value);
  printf("expected ret 1, actual %d\n",ret);
  printf("expected value d, actual value %c\n",value);

  queue_by2stackPop(&q);
  queue_by2stackPrint(&q);
  ret = queue_by2stackTop(&q,&value);
  printf("expected ret -1, actual %d\n",ret);

  return 0;
}

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值