算法导论基础篇:两个队列实现一个栈

算法导论基础篇:两个队列实现一个栈

队列的基本操作:初始化、判断是否为空、判断是否满、清空队列、释放队列、入队、出队、求队列的长度

 

typedef struct Queue
{
	int queuesize;
	int head, tail;
	int *q;
}Queue;

void InitQueue(Queue *q);
void EnQueue(Queue *q, int key);
int DeQueue(Queue *q);
int SizeOfQueue(Queue *q);
int IsQueueEmpty(Queue *q);
int IsQueueFull(Queue *q);

//初始化队列
void InitQueue(Queue *q)
{
	if(q = new Queue)
	{
		q->head = 0;
		q->tail = 0;
		return q;
	}
	else
	{
		return NULL;
	}
	
}
//判断队列是否为空
int IsQueueEmpty(Queue *q)
{
	if (q->head == q->tail)
	{
		return 1; //队列为空
	}
	else
	{
		return 0;
	}
}

//判断队列是否满
int IsQueueFull(Queue *q)
{
	if (q->tail == q->queuesize)
	{
		return 1; //队列是满的
	}
	else
	{
		return 0;
	}
}

//清空队列
void ClearQueue(Queue *q)
{
	q->head = 0;
	q->tail = 0;
	q->queuesize = 0;
}

//释放队列
void FreeQueue(Queue *q)
{
	if (q != NULL)
	{
		delete q;
	}
}

//入队列
void EnQueue(Queue *q, int key)
{
	if (q->tail == q->queuesize)
	{
		cout<<"the Queue if full!";
		
	}
	else
	{
		q->tail++ = key;
	}
}

//出队列
int DeQueue(Queue *q)
{
	int a;
	if (q->head == q->tail)
	{
		cout<<"the Queue is empty!"
        exit(0);
	}
	else
	{
		a = q->head;
		q->head ++;
		return a;
	}
}

//队列的长度
int SizeOfQueue(Queue *q)
{
	if (q->head == q->tail)
	{
		return 0;
	}
	else
	{
		return (q->tail - q->head);
	}
}


两个队列实现一个栈

 

 

 

 

实现一

思路

    q1是专职进出栈的,q2只是个中转站

  • 入栈:直接入队列q1即可
  • 出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中

图示

   

void Push(Queue *q1, Queue *q2, int k)
{
	EnQueue(q1, k);
}

int Pop(Queue *q1, Queue *q2)
{
	int temp;
	if (IsQueueEmpty(q1) == 1)
	{
		cout<<"Stack EMPTY!"<<endl;
	}
	else
	{
		while(SizeOfQueue(q1) != 1)
		{
			EnQueue(q2, DeQueue(q1));
		}
		temp = DeQueue(q1);
		while(IsQueueEmpty(q2) == 0)
		{
			EnQueue(q1, DeQueue(q2));
		}
		return temp;
	}
}

 

实现二

 

思路

    q1是专职进出栈的,q2只是个中转站。元素集中存放在一个栈中,但不是指定(q1 或 q2)。

    定义两个指针:pushtmp:指向专门进栈的队列q1; tmp:指向临时作为中转站的另一个栈q2

  • 入栈:直接入pushtmp所指队列即可
  • 出栈:把pushtmp的除最后一个元素外全部转移到队列tmp中,然后把刚才剩下q1中的那个元素出队列

比较

    实现二,出栈后就不用转移回原来的栈了(图示最后一步),这样减少了转移的次数。

 

 

 

 

void Push(Queue *q1, Queue *q2, int k)
{
	Queue *pushtmp; //建立一个中转队列
	if (!IsQueueEmpty(q1))
	{
		pushtmp = q1;
	}
	else
	{
		pushtmp = q2;
	}
	EnQueue(pushtmp,k);
}

int Pop(Queue *q1, Queue *q2)
{
	int tempValue;
	Queue *pushtmp, *tmp;
	if (!IsQueueEmpty(q1))
	{
		pushtmp = q1;
		tmp = q2;
	}
	else
	{
		pushtmp = q2;
		tmp = q1;
	}

	if (IsQueueEmpty(pushtmp))
	{
		cout<<"stack empty!"<<endl;
	}
	else
	{
		while (SizeOfQueue(pushtmp))
		{
			EnQueue(tmp, DeQueue(pushtmp));
		}
		tempValue = DeQueue(pushtmp);
		return tempValue;
	}
}

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值