用栈实现队列

使用两个栈(一个入栈,一个出栈)实现队列。入栈时就往"入栈"中放数据,出栈时从"出栈的栈顶取数据",如果出栈为空,就从"入栈"中将数据倒过来,而且只需倒一次,就可以达到"队列"的效果。

在C语言中,我们需要自己定义栈数据结构以及一些操作,再创建该结构的两个栈对象。而在C++中,我们可以直接调用库创建两个栈变量。以下代码的前提是假设我们已经实现好了栈结构及其接口(Stack)
以下是数据结构以及一些接口实现:

typedef struct
{
	Stack pushST;//入栈
	Stack popST;//出栈
}MyQueue;

MyQueue* myQueueCreate(MyQueue* obj, int maxSize)//初始化“队列”
{
	//obj = (MyQueue*)malloc(sizeof(MyQueue));
	//初始化两个栈
	StackInit(&obj->pushST, maxSize);
	StackInit(&obj->popST,  maxSize);

	return obj;
}

void myQueuePush(MyQueue* obj, int x)//入“队列”
{
	StackPush(&obj->pushST, x);
}

int myQueuePop(MyQueue* obj)//出“队列”
{
	if (StackEmpty(&obj->popST) == 0)//出栈未空,则将入栈中的数据倒过来
	{
		while (StackEmpty(&obj->pushST) != 0)
		{
			StackPush(&obj->popST, StackTop(&obj->pushST));
			StackPop(&obj->pushST);
		}
	}
	//倒过来了,或者出栈不为空,直接pop
	int front = StackTop(&obj->popST);
	StackPop(&obj->popST);
	return front;//返回出队首的元素
}

int myQueuePeek(MyQueue* obj)//取队头数据
{
	//这个操作与上面一样,唯一区别是:最后不用pop,直接return
	if (StackEmpty(&obj->popST) == 0)//出栈未空,则将入栈中的数据倒过来
	{
		while (StackEmpty(&obj->pushST) != 0)
		{
			StackPush(&obj->popST, StackTop(&obj->pushST));
			StackPop(&obj->pushST);
		}
	}
	
	return StackTop(&obj->popST);//直接返回出队首的元素
}

int myQueueEmpty(MyQueue* obj)//判空(空返回0)
{
	if ((StackEmpty(&obj->popST)==0) && (StackEmpty(&obj->pushST)==0))
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

void myQueueFree(MyQueue* obj)//销毁
{
	StackDestory(&obj->popST);
	StackDestory(&obj->pushST);
	free(obj);
}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值