力扣 剑指Offer【用两个栈实现队列】

这篇博客介绍了一个使用两个栈来模拟队列数据结构的实现方式。通过C++代码展示了如何创建、插入元素(appendTail)以及删除元素(deleteHead)的操作,确保在栈空时返回正确值。博客探讨了栈和队列特性结合的巧妙应用。
摘要由CSDN通过智能技术生成

题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1

在这里插入图片描述
题解:

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
typedef struct Stack{
    int * base;
    int length;
    int maxsize;
}Stack,* PStack;

typedef struct CQueue{
 Stack s1;
 Stack s2;
}CQueue,*PCQueue;

void init_Stack(Stack *S,int val){
  assert(S!=NULL);
  int * pnew = (int *)malloc(sizeof(int)* val);
  if(pnew == NULL){
      return ;
  }
  S->base = pnew;
  S->length =0;
  S->maxsize=val;

}

CQueue* cQueueCreate() {
    CQueue * pnewnode = (CQueue *)malloc(sizeof(CQueue));
    if(pnewnode == NULL){
        return NULL;
    }
    init_Stack(&pnewnode->s1,10000);
    init_Stack(&pnewnode->s2,10000);
    return pnewnode;

}
bool Pop(Stack *S,int * rtval){
    assert(S!=NULL);
   *rtval= S->base[--S->length];
   return true;

}
bool Push(Stack *S,int val){
    assert(S!=NULL);
    S->base[S->length++]=val;
    return true;

}
bool is_empty(Stack *S){
    assert(S!=NULL);
    return S->length ==0;


}
void Destory(Stack *S){
    assert(S!=NULL);
    free(S->base);


}
bool is_empty_CQ(CQueue * CQ){
    assert(CQ!=NULL);
   return is_empty(&CQ->s1) && is_empty(&CQ->s2);


}
void cQueueAppendTail(CQueue* obj, int value) {
  assert(obj!=NULL);
  Push(&obj->s1,value);


}


int cQueueDeleteHead(CQueue* obj) {
    assert(obj!=NULL);
   if(is_empty_CQ(obj)){
       return -1; 

    }
    int number=0,t=0;
    if(!is_empty(&obj->s2)){
        Pop(&obj->s2,&number);
        return number;
    }
    while(!is_empty(&obj->s1)){
     Pop(&obj->s1,&t);
     Push(&obj->s2,t);
    }
    Pop(&obj->s2,&number);
    return number;

}

void cQueueFree(CQueue* obj) {
  assert(obj!=NULL);
  Destory(&obj->s1);
  Destory(&obj->s2);
}

测试用例
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值