题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendtail和deletehead,分别完成在队列尾部插入节点和在队列头部删除节点的功能
思路:
先弄清楚队列的特点:先进先出,和栈的特点:先进后出。所以当你有两个栈时,其实就可以实现队列,比如我们把三个元素压入栈先a后b再c,这时c在栈顶,这时删除的话就会把栈顶的元素先删除,不符合题意。如何要把先进的a先删了呢,自然是把这些元素都弹出来,一个个压入栈2,c第一个进,b第二个,a第三个,自然就实现了当初a先进,但先删的是a。
代码实现:
typedef struct {
int* stk;
int stkSize;
int stkCapacity;
} Stack;
Stack* stackCreate(int cpacity) {
Stack* ret = malloc(sizeof(Stack));
ret->stk = malloc(sizeof(int) * cpacity);
ret->stkSize = 0;
ret->stkCapacity = cpacity;
return ret;
}
void stackPush(Stack* obj, int value) {
obj->stk[obj->stkSize++] = value;
}
void stackPop(Stack* obj) {
obj->stkSize--;
}
int stackTop(Stack* obj) {
return obj->stk[obj->stkSize - 1];
}
bool stackEmpty(Stack* obj) {
return obj->stkSize == 0;
}
void stackFree(Stack* obj) {
free(obj->stk);
}
typedef struct {
Stack* inStack;
Stack* outStack;
} CQueue;
CQueue* cQueueCreate() {
CQueue* ret = malloc(sizeof(CQueue));
ret->inStack = stackCreate(10000);
ret->outStack = stackCreate(10000);
return ret;
}
void in2out(CQueue* obj) {
while (!stackEmpty(obj->inStack)) {
stackPush(obj->outStack, stackTop(obj->inStack));
stackPop(obj->inStack);
}
}
void cQueueAppendTail(CQueue* obj, int value) {
stackPush(obj->inStack, value);
}
int cQueueDeleteHead(CQueue* obj) {
if (stackEmpty(obj->outStack)) {
if (stackEmpty(obj->inStack)) {
return -1;
}
in2out(obj);
}
int x = stackTop(obj->outStack);
stackPop(obj->outStack);
return x;
}
void cQueueFree(CQueue* obj) {
stackFree(obj->inStack);
stackFree(obj->outStack);
}