题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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);
}
测试用例