用栈实现队列(leetcode简单)+用队列实现栈(leetcode简单)

本文介绍了如何使用栈实现队列和队列实现栈的C语言代码。通过两个栈实现队列,利用栈的后进先出特性模拟队列的先进先出;而用两个队列实现栈,通过队列的特性达到栈的效果。这两个数据结构的转换展示了对栈和队列特性的深入理解。
摘要由CSDN通过智能技术生成

学完栈和队列的实现之后可以来做一做这两个题。

232. 用栈实现队列

思路:

1.将写好的栈接口函数放到leetcode题解之前

数据结构初阶之栈(C语言实现)_何以过春秋的博客-CSDN博客

2.用一个栈实现入队列,另一个栈实现出队列,举个例子,两个栈分别起名字pushst和popst,意为入栈和出栈,模仿入队列,给pushst入1 2 3 4 ,此时栈顶为4,然后出栈给popst,进入popst为4 3 2 1 ,此时栈顶为1,再模仿出队列,就可以输出 1 2 3 4 ,达到先进先出的效果,这时呢,pushst又进来5 6 7 此时若想出5 6 7 必须先将1 2 3 4 出完。

typedef struct 
{
    ST pushst;
    ST popst;
} MyQueue;

MyQueue* myQueueCreate() 
{
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&obj->pushst);
    StackInit(&obj->popst);
    return obj;
}

void myQueuePush(MyQueue* obj, int x) 
{
    StackPush(&obj->pushst,x);
}

int myQueuePop(MyQueue* obj) 
{
    //看pop队列中元素是否为空,若为空,则将push队列中元素送到pop中,然后定义(取出)pop的栈顶,出栈并返回
    if(StackEmpty(&obj->popst))
    {
        while(!StackEmpty(&obj->pushst))
        {
            StackPush(&obj->popst,StackTop(&obj->pushst));
            StackPop(&obj->pushst);
        }
    }
    int front=StackTop(&obj->popst);
    StackPop(&obj->popst);
    return front;
}

int myQueuePeek(MyQueue* obj) 
{
        if(StackEmpty(&obj->popst))
    {
        while(!StackEmpty(&obj->pushst))
        {
            StackPush(&obj->popst,StackTop(&obj->pushst));
            StackPop(&obj->pushst);
        }
    }
    return StackTop(&obj->popst);
}

bool myQueueEmpty(MyQueue* obj) 
{
    return StackEmpty(&obj->popst)&&StackEmpty(&obj->pushst);
}

void myQueueFree(MyQueue* obj) 
{
    StackDestroy(&obj->popst);
    StackDestroy(&obj->pushst);
    free(obj);
}

用队列实现栈

 思路:
1.将写好的队列接口函数放到leetcode题解之前

数据结构初阶之队列(C语言实现)_何以过春秋的博客-CSDN博客

2.两个空队列,给一个队列,命名为非空,开始入数据,比如1 2 3 4,入完之后,想模拟出栈,则需要将该入好的队列中的数据出队列,也就是将1 2 3 4去另一个队列,该队列命名为空队列,出一个移除一个,出到4时,空队列有1 2 3 ,非空队列有4 ,此时非空队列出栈,出4。

3.想出其他的数据,反复迭代即可。

typedef struct {
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate() {
    
    MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&obj->q1);
    QueueInit(&obj->q2);
    return obj;
}

void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1,x);
    }
    else
    {
        QueuePush(&obj->q2,x);
    }
}

int myStackPop(MyStack* obj) {
    Queue*emptyQ=&obj->q1;
    Queue*nonEmptyQ=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        emptyQ=&obj->q2;
        nonEmptyQ=&obj->q1;
    }
    while(QueueSize(nonEmptyQ)>1)
    {
        QueuePush(emptyQ,QueueFront(nonEmptyQ));
        QueuePop(nonEmptyQ);
    }
    int top=QueueFront(nonEmptyQ);
    QueuePop(nonEmptyQ);
    return top;
}

int myStackTop(MyStack* obj) {
    if(!QueueEmpty(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }

}

bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);

}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);
}

其实这两个题就是考验对栈和队列的性质理解运用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值