利用栈实现队列(力扣第232题)

  1. 先明确思路:用两个栈实现一个队列。队列的特点是先进先出。栈的特点是先进后出。
  2. 定义两个栈,一个栈是stack_in,另一个栈是stack_out。stack_out这个栈专门实现pop操作,stack_in实现队列的其他基本操作。
  3. 移除栈的一个元素与移除队列的一个元素的顺序相比较的话,发现顺序刚好是相反的。队列要移除的元素刚好在栈的底部。这时,我们借助stack_out这个栈来实现此操作。将stack_in中的元素先全部出栈,再将这些元素全部入栈到stack_out中,这时出栈(此时栈为stack_out)的顺序与队列一致。
  4. 出栈完成之后,再将stack_out的元素按照同样的方法入栈到stack_in中,以免干扰其余的操作。
typedef struct{
int * data;
int top;
} Mystack;
typedef struct {
    Mystack* stack_in;
    Mystack* stack_out;
} MyQueue;

Mystack* mystackcreate(){
    Mystack* q=malloc(sizeof(Mystack));
    q->data=malloc(sizeof(int)*80);
    q->top=-1;
    return q;
}
void mystack_push(Mystack* q,int val){
     q->top++;
    q->data[q->top]=val;
}
int mystack_pop(Mystack* q){
    int tmp=q->data[q->top];
    q->top--;
    return tmp;
}
int mystack_isempty(Mystack* q){
    if(q->top==-1)   return 1;
    return 0;
}
int mystack_gettop(Mystack* q){
    return q->data[q->top];
}
MyQueue* myQueueCreate() {
    MyQueue* obj=malloc(sizeof(MyQueue));
    obj->stack_in=mystackcreate();
    obj->stack_out=mystackcreate();
    return obj;
}

void myQueuePush(MyQueue* obj, int x) {
    
    mystack_push(obj->stack_in,x);
}

int myQueuePop(MyQueue* obj) {
    while(!mystack_isempty(obj->stack_in)){
        mystack_push(obj->stack_out,mystack_gettop(obj->stack_in));
        mystack_pop(obj->stack_in);
    }
    int tmp=mystack_gettop(obj->stack_out);
    mystack_pop(obj->stack_out);
    while(!mystack_isempty(obj->stack_out)){
        mystack_push(obj->stack_in,mystack_gettop(obj->stack_out));
        mystack_pop(obj->stack_out);
    }
    return tmp;
}

int myQueuePeek(MyQueue* obj) {
    int tmp=obj->stack_in->data[0];
    return tmp;
}

bool myQueueEmpty(MyQueue* obj) {
    if(obj->stack_in->top==-1)  return true;
    return false;
}

void myQueueFree(MyQueue* obj) {
    free(obj->stack_in);
    free(obj->stack_out);
    free(obj);
}

作者:。。。。
链接:https://leetcode.cn/problems/implement-queue-using-stacks/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值