使用两个栈实现先入先出队列,要求完成队列的插入删除获取队首队尾元素等操作。、
方法一
队列结构
typedef struct {
AS stackpush;
AS stackpop;
} MyQueue;
初始化
MyQueue* myQueueCreate() {
MyQueue* mq = (MyQueue*)malloc(sizeof(MyQueue));
if(mq == NULL)
{
perror("malloc fail");
exit(-1);
}
AStackInit(&mq->stackpush);
AStackInit(&mq->stackpop);
return mq;
}
入队
入队,把元素插入stackpush栈即可。
void myQueuePush(MyQueue* obj, int x) {
AStackPush(&obj->stackpush , x);
}
获取队头元素
如果stackpop栈有数据,那么直接获取栈顶数据即为队头元素;若没有数据,将stackpush栈中所有数据从栈顶依次倒入stackpop栈,然后获取栈顶数据。所以可以用于出队的简便实现。
int myQueuePeek(MyQueue* obj) {
if(AStackEmpty(&obj->stackpop))
{
while(!AStackEmpty(&obj->stackpush))
{
AStackPush(&obj->stackpop , AStackTop(&obj->stackpush));
AStackPop(&obj->stackpush);
}
}
int tmp = AStackTop(&obj->stackpop);
return tmp;
}
出队
在获取队头元素的基础上,将stackpop栈栈顶数据进行删除即可。
int myQueuePop(MyQueue* obj) {
int tmp = myQueuePeek(obj);
AStackPop(&obj->stackpop);
return tmp;
}
判断队列是否为空
bool myQueueEmpty(MyQueue* obj) {
return AStackEmpty(&obj->stackpush) && AStackEmpty(&obj->stackpop);
}
释放空间
void myQueueFree(MyQueue* obj) {
AStackDestroy(&obj->stackpush);
AStackDestroy(&obj->stackpop);
free(obj);
obj=NULL;
}
方法二
队列结构
typedef struct {
AS stack1;
AS stack2;
} MyQueue;
初始化
MyQueue* myQueueCreate() {
MyQueue* mq = (MyQueue*)malloc(sizeof(MyQueue));
if(mq == NULL)
{
perror("malloc fail");
exit(-1);
}
AStackInit(&mq->stack1);
AStackInit(&mq->stack2);
return mq;
}
入队
非空栈执行入队操作。
void myQueuePush(MyQueue* obj, int x) {
if(!AStackEmpty(&obj->stack1))
AStackPush(&obj->stack1,x);
else
AStackPush(&obj->stack2,x);
}
获取队头元素
使用假设判断法,将非空栈中前N-1个数据倒入空栈,然后获取最后栈顶数据,再将空栈中倒入数据倒回来。
int myQueuePeek(MyQueue* obj) {
AS* emptys = &obj->stack1;
AS* nonemptys = &obj->stack2;
if(AStackEmpty(&obj->stack2))
{
nonemptys = &obj->stack1;
emptys = &obj->stack2;
}
while(AStackSize(nonemptys)>1)
{
AStackPush(emptys , AStackTop(nonemptys));
AStackPop(nonemptys);
}
int tmp = AStackTop(nonemptys);
while(!AStackEmpty(emptys))
{
AStackPush(nonemptys , AStackTop(emptys));
AStackPop(emptys);
}
return tmp;
}
出队
比获取队头元素多一些步骤,将非空栈N-1个数据倒入空栈后,获取原非空栈栈顶数据后删除,然后将空栈中倒入的数据倒回到非空栈。
int myQueuePop(MyQueue* obj) {
AS* emptys = &obj->stack1;
AS* nonemptys = &obj->stack2;
if(AStackEmpty(&obj->stack2))
{
nonemptys = &obj->stack1;
emptys = &obj->stack2;
}
while(AStackSize(nonemptys)>1)
{
AStackPush(emptys , AStackTop(nonemptys));
AStackPop(nonemptys);
}
int tmp = AStackTop(nonemptys);
AStackPop(nonemptys);
while(!AStackEmpty(emptys))
{
AStackPush(nonemptys , AStackTop(emptys));
AStackPop(emptys);
}
return tmp;
}
判断队列是否为空
bool myQueueEmpty(MyQueue* obj) {
return AStackEmpty(&obj->stack1) && AStackEmpty(&obj->stack2);
}
释放空间
void myQueueFree(MyQueue* obj) {
AStackDestroy(&obj->stack1);
AStackDestroy(&obj->stack2);
free(obj);
obj=NULL;
}