day26 力扣225 用队列实现栈

链接225. 用队列实现栈 - 力扣(LeetCode)

题目

 

 思路:

  • 声明两个队列,队列2用于备用(存放无用的元素),与用队列实现栈不同的是,队列是先进先出,栈顶指针为队列1尾指针
  • step①:声明结构体存放栈和队列,初始化
typedef struct {
    int queue1[100],queue2[100];//队列2是备用队列,主要功能由队列1实现
    int front1,front2;
    int tail1,tail2;//注意队列是先进先出
} MyStack;


MyStack* myStackCreate() {
    MyStack *creat=malloc(sizeof(MyStack));
    creat->front1=0;
    creat->front2=0;
    creat->tail1=0;
    creat->tail2=0;
    return creat;//记得返回此结构体
}

  •  step②:将元素x压入栈顶即放在队列1的尾部
//将元素存入队列,注意是尾指针后移
void myStackPush(MyStack* obj, int x) {
    obj->queue1[(obj->tail1)++]=x;
}

  • step③:返回栈顶元素并令其出队

难点:理解做法的含义,区分与用队列实现栈的不同之处 

 

 

//栈顶元素出队
int myStackPop(MyStack* obj) {
    int front1=obj->front1;
    int front2=obj->front2;
    int tail1=obj->tail1;
    int tail2=obj->tail2;

    //将队列1的元素除了最后一个外,备份到队列2
    while(front1<tail1-1)
    {
        obj->queue2[tail2++]=obj->queue1[front1++];
    }
    //弹出队列1最后一个元素并保存
    int top=obj->queue1[front1++];//注意此时front1是后移
    //把其余队列2中的元素导回队列1
    while(front2<tail2)
    {
        obj->queue1[tail1++]=obj->queue2[front2++];
    }
    //更新队列首尾指针
    obj->front1=front1,obj->front2=front2;
    obj->tail1=tail1,obj->tail2=tail2;
    //返回栈顶指针(即队列1弹出的元素)
    return top;
}

 此时可以直观感受到更新队列首尾指针的重要作用:指针的位置一直在改变,更新后却不会影响队列操作

  • step④:返回栈顶元素
//即返回栈尾元素
int myStackTop(MyStack* obj) {
    return obj->queue1[(obj->tail1)-1];//与栈实现队列中栈顶指针intop和outtop的易错点相同
}

  • step⑤:判空返回值
//判空,即队列1首尾指针相等
bool myStackEmpty(MyStack* obj) {
    return obj->front1==obj->tail1;
}

  • step⑥:置空
//释放栈,两个队列首尾指针都为0
void myStackFree(MyStack* obj) {
    obj->front1=0,obj->front2=0;
    obj->tail1=0,obj->tail2=0;
}

最终代码

typedef struct {
    int queue1[100],queue2[100];//队列2是备用队列,主要功能由队列1实现
    int front1,front2;
    int tail1,tail2;//注意队列是先进先出
} MyStack;


MyStack* myStackCreate() {
    MyStack *creat=malloc(sizeof(MyStack));
    creat->front1=0;
    creat->front2=0;
    creat->tail1=0;
    creat->tail2=0;
    return creat;//记得返回此结构体
}

//将元素存入队列,注意是尾指针后移
void myStackPush(MyStack* obj, int x) {
    obj->queue1[(obj->tail1)++]=x;
}

//栈顶元素出队
int myStackPop(MyStack* obj) {
    int front1=obj->front1;
    int front2=obj->front2;
    int tail1=obj->tail1;
    int tail2=obj->tail2;

    //将队列1的元素除了最后一个外,备份到队列2
    while(front1<tail1-1)
    {
        obj->queue2[tail2++]=obj->queue1[front1++];
    }
    //弹出队列1最后一个元素并保存
    int top=obj->queue1[front1++];//注意此时front1是后移
    //把其余队列2中的元素导回队列1
    while(front2<tail2)
    {
        obj->queue1[tail1++]=obj->queue2[front2++];
    }
    //更新队列首尾指针
    obj->front1=front1,obj->front2=front2;
    obj->tail1=tail1,obj->tail2=tail2;
    //返回栈顶指针(即队列1弹出的元素)
    return top;
}

//即返回栈尾元素
int myStackTop(MyStack* obj) {
    return obj->queue1[(obj->tail1)-1];//与栈实现队列中栈顶指针intop和outtop的易错点相同
}

//判空,即队列1首尾指针相等
bool myStackEmpty(MyStack* obj) {
    return obj->front1==obj->tail1;
}

//释放栈,两个队列首尾指针都为0
void myStackFree(MyStack* obj) {
    obj->front1=0,obj->front2=0;
    obj->tail1=0,obj->tail2=0;
}

/**
 * Your MyStack struct will be instantiated and called as such:
 * MyStack* obj = myStackCreate();
 * myStackPush(obj, x);
 
 * int param_2 = myStackPop(obj);
 
 * int param_3 = myStackTop(obj);
 
 * bool param_4 = myStackEmpty(obj);
 
 * myStackFree(obj);
*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值