用两个队列实现一个栈

文章主要是介绍如何通过两个队列实现一个栈,文章内容包括实现原理和实现源码。

一、实现原理

首先看图1


                                                                               图1

首先两个队列queue1、queue2都是空队列,比方说我们一开始往栈内压入元素a,则我们选择把a插入两个任意队列一个。我们这里选择把a插入queue1。接着往栈内压入b、c两个元素,我们把它们都插入queue1。这个时候queue1包含三个元素a、b和c,其中a位于队列的头部,c位于队列的尾部。

接下来出栈一个元素,根据栈的后入先出原则,最后被压入的c应该最新被弹出。由于c位于queue1的尾部,而我们每次只能从队列的头部删除元素,因此我们可先从queue1中依次删除元素a、b并插入到queue2中,再从queue1删除元素c。这相当于从栈中弹出元素c。对于元素b可同理出栈。

接下来我们考虑往栈内压入一个元素d。此时queue1已经有一个元素,我们就把d插入到queue1的尾部。如果我们再从栈内出一个元素,此时被弹出的元素应该是最后被压入的d,由于d位于queue1的尾部,我们只能先从头删除queue1的元素并插入到queue2,直到queue1中遇到d再直接把它删除。


二、代码实现

代码实现的过程是先入栈0~9个整数,然后出栈最后5个数,然后再入栈5个数,最后再出栈所有的数。源码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _QNode
{
	int data;
	struct _QNode *next;
}QNode;

typedef struct _Queue
{
	QNode *front,*rear;
}Queue;

/*入栈*/
void stack_in(Queue *q1, Queue *q2, int val)
{		
	QNode *p;
	
	if(q1==NULL || q2==NULL)
	{
		printf("Error: queue is err!\n");
		return;
	}
	
	if(q1->front==q1->rear && q2->front==q2->rear)
	{
	    //printf("First stack in val:%d\n",val);
		/*if q1 and q2 is all empty,let data in q1*/
		p=(QNode *)malloc(sizeof(QNode));
		if(!p)
		{
			printf("Error:malloc queue fail!\n");
			return;
		}
		p->data = val;
		p->next = NULL;
		q1->rear->next = p;
		q1->rear = p;
		//return;
	}else if(q1->front!=q1->rear)
	{
	    /*let data in queue who had data*/
	    //printf("Q1 stack in val:%d\n",val);
		p=(QNode *)malloc(sizeof(QNode));
		if(!p)
		{
			printf("Error:malloc queue fail!\n");
			return;
		}
		p->data = val;
		p->next = NULL;
		q1->rear->next = p;
		q1->rear = p;
	}
	else
	{
	    //printf("Q2 stack in val:%d\n",val);
		p=(QNode *)malloc(sizeof(QNode));
		if(!p)
		{
			printf("Error:malloc queue fail!\n");
			return;
		}
		p->data = val;
		p->next = NULL;
		q2->rear->next = p;
		q2->rear = p;
	}

	return;
}

/*出栈*/
int stack_out(Queue *q1,Queue *q2)
{
    int val;
	QNode *p,*q;
	
	if(q1==NULL && q2==NULL)
	{
		return;
	}

	if(q1->front != q1->rear)
	{
	    /*q1队列中有元素*/
		q1->rear=q1->front;
		p=q1->front->next;
		q1->front->next=NULL;
		while(p->next)
		{
			q=p;
			stack_in(q1,q2,p->data);	
			p=p->next;
			free(q);
		}		

		val=p->data;	
	
		free(p);
		return val;
	}
	else
	{
		/*q2队列中有元素*/
		q2->rear=q2->front;
		p=q2->front->next;
		q2->front->next=NULL;
		while(p->next)
		{
			q=p;
			stack_in(q1,q2,p->data);	
			p=p->next;
			free(q);
		}		

		val=p->data;	
	
		free(p);
		return val;
	}	
}

/*打印队列里的内容*/
void queue_print(Queue *Q)
{
	if(Q==NULL)
		return;
	QNode *p=NULL;
	p=Q->front->next;
	while(Q->rear != p)
	{
		printf("Queue value:%d\n",p->data);
		p=p->next;
	}
	printf("Queue value:%d\n",p->data);
}

/*队列初始化*/
void initQueue(Queue **Q)
{
	if(Q==NULL)
	{
		return;
	}
	
	*Q=(Queue *)malloc(sizeof(Queue));
	if((*Q)==NULL)
	{
		return;
	}

	(*Q)->front=(*Q)->rear=(QNode *)malloc(sizeof(QNode));
}

int main()
{
        int i;	
        int val;
	Queue *queue1=NULL;
	Queue *queue2=NULL;

	initQueue(&queue1);
	initQueue(&queue2);
	
	for(i=0; i<10; i++)
	{
		stack_in(queue1, queue2, i);
	}
		
	queue_print(queue1);
	
	for(i=0;i<5;i++)	
	{
		val=stack_out(queue1,queue2);
		printf("Stack out val:%d\n",val);	
	}

	for(i=11; i<=15; i++)
	{
		stack_in(queue1, queue2, i);
	}
	
	for(i=0;i<10;i++)	
	{
		val=stack_out(queue1,queue2);
		printf("Stack out val:%d\n",val);	
	}
	
	return 0;		
}
执行的效果图如下:



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值