队列本身特性为“先进先出”,而栈为“先进后出”。
队列的主要操作有入队和出队,入队从队尾入,出队则从队头开始。
qu1队列中所有数据直接入队,即入栈,需要出栈的时候,将qu1中数据依次出队然后入队到qu2中,当qu1中只剩下最后一个数据(即7)时停止出队,将这7直接弹出,此时7本身是最后入队却是最先出队,即实现了出栈功能。
当想要出6时,将qu2中0~5依次出队然后又入队至qu1中,再直接弹出6即可。
剩下的元素依次往下执行即可。
队列结构体:
#define SIZE 8
typedef struct Queue
{
int elem[SIZE];
int front;
int rear;
}Queue,*QueueS;
功能实现代码:
//初始化队列
void InitQueueS(QueueS queue)
{
assert(queue != NULL);
queue->front = 0;
queue->rear = 0;
}
//判满
static bool IsFull(QueueS queue)
{
return (queue->rear+1)%SIZE == queue->front;
}
//判空
bool IsEmpty(QueueS queue)
{
return queue->front == queue->rear;
}
//入队
bool Push(QueueS queue,int val)//front头 rear尾
{
if(IsFull(queue))
{
return false;
}
queue->elem[queue->rear] = val;//尾插法入队
queue->rear = (queue->rear+1)%SIZE;//注意!!!
return true;
}
//出队
bool Pop(QueueS queue,int *rtv)
{
if(IsEmpty(queue))
return false;
if(rtv != NULL)
{
*rtv = queue->elem[queue->front];
}
queue->front = (queue->front+1)%SIZE;
return true;
}
//得到队列当前长度
int GetLength(QueueS queue)
{
return (queue->rear - queue->front + SIZE)%SIZE;
}
//入栈
void EnterStack(Queue *qu1,Queue *qu2,int val)
{
Queue *p = NULL;
if(!IsEmpty(qu1))//入队入到当前不为空的队列里面
{
p = qu1;
}
else
{
p = qu2;
}
Push(p,val);//入队
}
//出栈
int PopStack(Queue *qu1,Queue *qu2)
{
Queue *p = NULL;//永远指向入队的队列
Queue *q = NULL;//永远指向从P出来的队列
if(!IsEmpty(qu1))
{
p = qu1;
q = qu2;
}
else
{
p = qu2;
q = qu1;
}
int tmp = 0;
if(IsEmpty(p))
{
;//空语句
}
else
{
while(GetLength(p) != 1)//出到只剩下一个数据
{
Pop(p,&tmp);//先出队
Push(q,tmp);//再入队
}
Pop(p,&tmp);//出循环之后将最后一个数据直接弹出
}
return tmp;
}
void Show(QueueS queue)
{
int i=queue->front;
while(i != queue->rear)
{
printf("%d ",queue->elem[i]);
i =(i+1)%SIZE;//注意!!!
}
printf("\n");
}