使用两个队列实现一个栈

本文介绍了一种使用两个队列来模拟栈数据结构的方法。主要步骤包括:压栈时检查哪个队列为空并插入数据;出栈时将非空队列的元素(除最后一个)移至另一队列并删除最后一个元素;获取栈顶元素通过查找非空队列的队尾。此方法巧妙利用了队列的先进先出特性来实现栈的后进先出行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用两个队列实现一个栈。
(1)压栈:检测哪个队列有数据,将数据放到该队列。
(2)出栈:检测哪个队列有数据,将除队尾的数据导入另一个队列中,最后删除队尾。
(3)返回有数据的队尾节点。(前提是数据在该队列中)

#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef int QDataType;

typedef struct QListNode
{
	struct QListNode *next;
	QDataType data;	
}QListNode;

typedef struct Queue
{
	QListNode* front;
	QListNode* rear;
	QDataType sz;
}Queue;

typedef struct StackBy2Queue
{	
	Queue q1;
	Queue q2;
}StackBy2Queue;

QListNode *BuyNewNode(QDataType data)
{
	QListNode* newNode = (QListNode *)malloc(sizeof(QListNode));
	if(NULL == newNode)
	{
		return NULL;
	}
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

void QueueInit(Queue* q)
{
	assert(q);
	q->front = q->rear = BuyNewNode(0);
	q->sz = 0;
}

void QueuePush(Queue* q,QDataType data)
{
	assert(q);
	q->rear->next = BuyNewNode(data);
	q->rear = q->rear->next;
	q->sz++;
}

void QueuePop(Queue* q)
{
	assert(q);
	if(q->front != q->rear)
	{	
		QListNode* pDel = q->front->next;
		q->front->next = pDel->next;
		q->sz--;
		free(pDel);
		pDel = NULL:
	}
}

QDataType QueueFront(Queue* q)
{	
	assert(q);
	return q->front->next->data;
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	return q->rear->data;
}

int QueueSize(Queue* q)
{
	assert(q);
	return q->sz;
}

int QueueEmpty(Queue* q)
{	
	assert(q);
	return 0==QueueSize(q);
}

//////////////////////////////////
//以上为队列的基本操作;
//以下为两个队列实现的栈的操作;
//////////////////////////////////

void StackBy2QueueInit(StackBy2Queue* s)
{
	assert(s);
	QueueInit(s->q1);
	QueueInit(s->q2);
}

void StackBy2QueuePush(StackBy2Queue* s,QDataType data)
{
	assert(s);
	if(QueueSize(&s->q1))
	{	
		QueuePush(&s->q1,data);
	}
	else
	{
		QueuePush(&s->q2,data);
	}
}

void StackBy2QueuePop(StackBy2Queue* s)
{
	assert(s);
	if(QueueSize(&s->q1))
	{
		while(QueueSize(&s->q1)>1)
		{
			QueuePush(&s->q2,QueueFront(&s->q1));
			QueuePop(&s>q1);
		}
		QueuePop(&s->q1);
	}
	else
	{
		while(QueueSize(&s->q2)>1)
		{
			QueuePush(&s->q1,QueueFront(&s->q2));
			QueuePop(&s>q2);
		}
		QueuePop(&s->q2);
	}
}

QDataType StackBy2QueueTop(StackBy2Queue *s)
{
	assert(s);
	if(QueueSize(&s->q1)
	{
		return QueueBack(&s->q1);
	}
	else
	{	
		return QueueBack(&s->q2);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值