用二个栈实现一个队列
现在的基本想法是:
2个栈inS,outS
一个栈用来取出队首元素,另一个栈用来加入队尾元素
入队操作:即将元素压入栈inS,若inS栈满,则检查outS是否为空,若是则主动将inS中的元素pop并push到inS中去,否则则显示队列满
出队操作:从栈outS取出元素,若栈空,将栈inS中的元素全部pop并push到outS中去,若二个栈都空,则说明队列为空
算法基本思想已经确定,关键是细节的处理。。。
而且针对这个程序,应该设计一套完整的的测试用例test case
核心代码:
struct queue
{
struct stack *inS;
struct stack *outS;
};
int initQueue(struct queue* &q)
{
q = (struct queue*)malloc(sizeof(struct queue));
initStack(q->inS);
initStack(q->outS);
}
int isQueueEmpty(struct queue *q)
{
if(isStackEmpty(q->inS)&&isStackEmpty(q->outS))
return 1;
else
return 0;
}
int isQueueFull(struct queue *q)
{
if(isStackFull(q->inS)&&!isStackEmpty(q->outS))
return 1;
else
return 0;
}
int enQueue(struct queue *q,int e)
{
if(!isQueueFull(q))
{
if(isStackEmpty(q->outS))
copyStack(q->inS,q->outS); //这里有点晦涩,在队列不满的情况下,若outS为空,则inS有满的可能,尽管inS不一定是满的,但这里将inS copy 到outS总不会出错的,而且不用在对inS是否是满的,再进行判断
push(q->inS,e);
}
else
return -1;
}
int deQueue(struct queue *q,int &e)
{
if(!isQueueEmpty(q))
{
if(isStackEmpty(q->outS))
copyStack(q->inS,q->outS);
pop(q->outS,e);
}
else
return -1;
}