使用两个栈(一个入栈,一个出栈)实现队列。入栈时就往"入栈"中放数据,出栈时从"出栈的栈顶取数据",如果出栈为空,就从"入栈"中将数据倒过来,而且只需倒一次,就可以达到"队列"的效果。
在C语言中,我们需要自己定义栈数据结构以及一些操作,再创建该结构的两个栈对象。而在C++中,我们可以直接调用库创建两个栈变量。以下代码的前提是假设我们已经实现好了栈结构及其接口(Stack)
以下是数据结构以及一些接口实现:
typedef struct
{
Stack pushST;//入栈
Stack popST;//出栈
}MyQueue;
MyQueue* myQueueCreate(MyQueue* obj, int maxSize)//初始化“队列”
{
//obj = (MyQueue*)malloc(sizeof(MyQueue));
//初始化两个栈
StackInit(&obj->pushST, maxSize);
StackInit(&obj->popST, maxSize);
return obj;
}
void myQueuePush(MyQueue* obj, int x)//入“队列”
{
StackPush(&obj->pushST, x);
}
int myQueuePop(MyQueue* obj)//出“队列”
{
if (StackEmpty(&obj->popST) == 0)//出栈未空,则将入栈中的数据倒过来
{
while (StackEmpty(&obj->pushST) != 0)
{
StackPush(&obj->popST, StackTop(&obj->pushST));
StackPop(&obj->pushST);
}
}
//倒过来了,或者出栈不为空,直接pop
int front = StackTop(&obj->popST);
StackPop(&obj->popST);
return front;//返回出队首的元素
}
int myQueuePeek(MyQueue* obj)//取队头数据
{
//这个操作与上面一样,唯一区别是:最后不用pop,直接return
if (StackEmpty(&obj->popST) == 0)//出栈未空,则将入栈中的数据倒过来
{
while (StackEmpty(&obj->pushST) != 0)
{
StackPush(&obj->popST, StackTop(&obj->pushST));
StackPop(&obj->pushST);
}
}
return StackTop(&obj->popST);//直接返回出队首的元素
}
int myQueueEmpty(MyQueue* obj)//判空(空返回0)
{
if ((StackEmpty(&obj->popST)==0) && (StackEmpty(&obj->pushST)==0))
{
return 0;
}
else
{
return 1;
}
}
void myQueueFree(MyQueue* obj)//销毁
{
StackDestory(&obj->popST);
StackDestory(&obj->pushST);
free(obj);
}