两个队列实现一个栈!

队列本身特性为“先进先出”,而栈为“先进后出”。

队列的主要操作有入队和出队,入队从队尾入,出队则从队头开始。

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

猜你喜欢

转载自blog.csdn.net/Disremembrance/article/details/84677309