【栈和链表面试题】使用两个栈实现一个队列

分析:

思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1

思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中  

           出队时,判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,在将stack2的栈顶元素弹出,否则,直接弹出stack2的栈顶元素

思路三:入队时,直接压入stack1中

           出队时,判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,否则直接弹出stack2中的元素

           下面实现的是思路一

 //QueueS.h
#pragma once
#include "Stack.h"
typedef  struct QueueS {
	Stack stack1;
	Stack stack2;
}QueueS;

void QueueSInit(QueueS* pQS);	   //初始化			  
void QueueSPush(QueueS* pQS, StackDataType data);    //插入
void QueueSPop(QueueS* pQS);                         //删除
StackDataType QueueSFront(QueueS* pQS);              //获取首元素
void TestQueueS();                                   //测试函数
#include"QueueS.h"

void QueueSInit(QueueS* pQS)
{
	StackInit(&(pQS->stack1));
	StackInit(&(pQS->stack2));
}
void QueueSPush(QueueS* pQS, StackDataType data)
{
	//无脑入栈1
	StackPush(&(pQS->stack1), data);
}
void QueueSPop(QueueS* pQS)
{
	if (StackIsEmpty(&(pQS->stack2))) {
		while (!(StackIsEmpty(&(pQS->stack1)))) {
			StackDataType s1 = getTop(&(pQS->stack1));
			StackPush(&(pQS->stack2), s1);
			StackPop(&(pQS->stack1));
		}
	}
	StackPop(&(pQS->stack2));
}
StackDataType QueueSFront(QueueS* pQS)
{
	if (StackIsEmpty(&(pQS->stack2))) {
		while (!(StackIsEmpty(&(pQS->stack1)))) {
			StackDataType s1 = getTop(&(pQS->stack1));
			StackPush(&(pQS->stack2), s1);
			StackPop(&(pQS->stack1));
		}
	}
	return getTop(&(pQS->stack2));
}

void TestQueueS()
{
	QueueS	qs;
	QueueSInit(&qs);

	for (int i = 0; i < 10; i++) {
		QueueSPush(&qs, i);
	}

	for (int i = 0; i < 10; i++) { 
		printf("%d\n", QueueSFront(&qs));
		QueueSPop(&qs);
	}
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值