每日编程12之用二个栈实现队列操作

用二个栈实现一个队列

现在的基本想法是:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值