数据结构之栈和队列的经典面试题

 

1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)

在这个题目中要求要返回一个栈里面的最小值。有两种方法:

1). 用两个栈,一个栈存入栈的数据,另一个栈存对应的最小值,如果入栈的顺序为5,8,1,3,4,则存最小值的那个栈存入的数据应该为5,5,1,1,1。

2). 与上边一样,用两个栈,一个放数据,另一个放最小值,最小值由结构体组成有两部分一个是数据元素data,一个是记录它对应的次数。但是与上边不同的是,在最小值的那个栈里面不会放重复的最小值如果入栈的顺序为5,8,1,3,4,则存最小值的那个栈存入的数据应该为5(2),1(3),在每一次出栈时都会比较最小值的次数和对应栈里面的数据是否对应。

 

// Min Stack返回栈的最小值

typedef int MSTDataType;
typedef struct MinStack
{
	Stack _st;
	Stack _minst;
}MinStack;

void MinStackInit(MinStack* pms);//初始化
void MinStackDestory(MinStack* pms);//销毁
void MinStackPush(MinStack* pms, MSTDataType x);//入栈
void MinStackPop(MinStack* pms);//出栈
MSTDataType MinStackMin(MinStack* pms);//获取站的最小值

 

// Min Stack返回栈的最小值

void MinStackInit(MinStack* pms)
{
	assert(pms);
	InitStack(&pms->_minst);
	InitStack(&pms->_st);
}
void MinStackDestory(MinStack* pms)
{
	assert(pms);
	DistoryStack(&pms->_minst);
	DistoryStack(&pms->_st);
}

void MinStackPush(MinStack* pms, MSTDataType x)
{
	assert(pms);
	StackPush(&pms->_st, x);
	if (StackEmpty(&pms->_minst) == NULL
		|| StackTop(&pms->_minst) >= x)//没有计数的情况下要有=
	{
		StackPush(&pms->_minst, x);
	}
}
void MinStackPop(MinStack* pms)
{
	assert(pms);
	if (StackTop(&pms->_st) == StackTop(&pms->_minst))
	{
		StackPop(&pms->_minst);
	}
	StackPop(&pms->_st);
}

MSTDataType MinStackMin(MinStack* pms)
{
	assert(pms);
	return StackTop(&pms->_minst);
}

 

2.使用两个栈实现一个队列


3.使用两个队列实现一个栈
4.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)
5.一个数组实现两个栈(共享栈)

 

还没写完。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值