栈和队列面试题

栈和队列面试题
1、实现一个栈,要求实现push(出栈),poop(入栈),Min(返回最小值)的时间复杂度位O(1)
方式1:给定两个栈,一个栈保存数据,一个栈保存最小值。取一个数据,压入数据栈中,同时向最小值栈中存入一个数据。取下一个数据,若是下一个数据小于最小值栈中的栈顶数据,则将该数据插入数据栈同时压入最小值栈中;否则压入数据栈中。
方式2:用一个栈实现:
(1)、压栈的时候,将一个相同的数据进栈两次,上面的那个数据表示数据,下面的元素表示最小值;继续压入下一个数据,并且用该元素与最小值进行比较:将该元素和当前最小值入栈,继续压入下面的元素……

实现代码:
# pragma once
# include"satck.h"
# include<assert.h>

 
//给出最小栈的操作
typedef struct MinStack
{
	Stack s;//用栈实现
}MinStack;
void MStackInit(MinStack *ms)
{
	assert(ms);
	StackInit(&ms->s);
}
//获取最小值
MSDataType GetMinData(MinStack *ms)
{
	return StackTop(&ms->s)._mindata;
}
void MStackPush(MinStack *ms, MSDataType data)
{
	//给出元素
	SElem elem;;
	elem._data = elem._mindata = data;
	if (!Stackempty(&ms->s))//栈里面有元素
	{
		MSDataType minData = GetMinData(ms);//获取最小值
		//如果最小值小于data,更新最小值中的data
		if (minData < data)
			elem._mindata = data;
	}
	StackPush(&ms->s,elem);
 }
int MSEmpty(MinStack *ms)
{
	assert(ms);
	return Stackempty(&ms->s);
}
void MStackPop(MinStack *ms)
{
	assert(ms);
	assert(!Stackempty(ms));
	StackPop(&ms->s);
}
//获取最小元素
MSDataType MStackTop(MinStack *ms)
{
	return StackTop(&ms->s)._data;
}
 
int MStackSize(MinStack *ms)
{
	return StackSize(&ms->s);
}
void TestMinStack()
{
	MinStack s;
	MStackInit(&s);
	MStackPush(&s, 2);
	MStackPush(&s, 3);
	MStackPush(&s, 4);
	MStackPush(&s, 7);
	MStackPush(&s, 5);
	printf("size=%d\n", MStackSize(&s));
	printf("top=%d\n", MStackTop(&s));
	printf("min=%d\n", MStackMinData(&s));
	MStackPop(&s);
	MStackPop(&s);
	printf("size=%d\n", MStackSize(&s));
	printf("top=%d\n", MStackTop(&s));
	printf("min=%d\n", MStackMinData(&s));
}

stack.h
# pragma oncee  
# include<stdio.h>  
# include<stdlib.h>  
# include<string.h>  
# include<assert.h>  
#define MAX_SIZE 10  
 
//栈里面放的元素
typedef int MSDataType;
typedef struct SElem
{
	MSDataType _data;//数据
	MSDataType _mindata;//最小值
}SElem;
typedef SElem DataTYpe;
typedef struct Stack
{
	DataTYpe _array[MAX_SIZE];//有效元素的个数  
	int _top; //栈顶元素的位置  
}Stack;

//初始化  
void StackInit(Stack *s);

//入栈  
void StackPush(Stack *s, DataTYpe data);

//出栈  
void StackPop(Stack *s);

//取栈顶元素  
DataTYpe StackTop(Stack *s);

//有效元素的个数  
int StackSize(Stack *s);

//检测栈是否为空  
int Stackempty(Stack *s);

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

3、

猜你喜欢

转载自blog.csdn.net/xuruhua/article/details/80541617